diff --git a/ocrmypdf/leptonica.py b/ocrmypdf/leptonica.py index 31a329fc..e81e96bb 100644 --- a/ocrmypdf/leptonica.py +++ b/ocrmypdf/leptonica.py @@ -19,6 +19,7 @@ from .lib._leptonica import ffi from functools import lru_cache lept = ffi.dlopen(find_library('lept')) +libc = ffi.dlopen(None) logger = logging.getLogger(__name__) @@ -110,39 +111,23 @@ class Pix: return "" def __getstate__(self): - state = {} - if self.cpix.colormap: - raise NotImplementedError('colormap') - else: - state['colormap'] = None - if self.cpix.text: - state['text'] = ffi.string(self.cpix.text)[:] - else: - state['text'] = None - if self.cpix.data: - data_bytes = self.cpix.wpl * self.cpix.h * 4 - state['data'] = ffi.buffer(self.cpix.data, data_bytes)[:] - else: - state['data'] = None + data = ffi.new('l_uint32 *[]', 1) + size = ffi.new('size_t *', 0) - cpix_copy = ffi.new('PIX *') - ffi.buffer(cpix_copy)[:] = self.cpix - cpix_copy.text = ffi.NULL - cpix_copy.colormap = ffi.NULL - cpix_copy.data = ffi.NULL + err = lept.pixSerializeToMemory(self.cpix, data, size) + if err != 0: + raise LeptonicaIOError("pixSerializeToMemory") - state['cpix'] = ffi.buffer(self.cpix)[:] - return state + char_data = ffi.cast('char *', data[0]) + data_bytes = ffi.buffer(char_data, size[0])[:] + return dict(data=data_bytes) def __setstate__(self, state): - import array - self.cpix = ffi.new('PIX *') - ffi.buffer(self.cpix)[:] = state['cpix'] + cdata_bytes = ffi.new('char[]', state['data']) + cdata_uint32 = ffi.cast('l_uint32 *', cdata_bytes) - data_array = array.array('I', state['data']) - self.cpix.data = ffi.from_buffer(data_array) - self.cpix.text = ffi.new('char[]', state['text']) - self.cpix.colormap = ffi.NULL + self.cpix = lept.pixDeserializeFromMemory( + cdata_uint32, len(state['data'])) @property def width(self): diff --git a/ocrmypdf/lib/compile_leptonica.py b/ocrmypdf/lib/compile_leptonica.py index ddf4e621..045a83fc 100644 --- a/ocrmypdf/lib/compile_leptonica.py +++ b/ocrmypdf/lib/compile_leptonica.py @@ -58,6 +58,9 @@ PIX *pixRotate180(PIX *pixd, PIX *pixs); l_int32 pixCountPixels ( PIX *pix, l_int32 *pcount, l_int32 *tab8 ); PIX * pixAnd ( PIX *pixd, PIX *pixs1, PIX *pixs2 ); l_int32 * makePixelSumTab8 ( void ); + +PIX * pixDeserializeFromMemory ( const l_uint32 *data, size_t nbytes ); +l_int32 pixSerializeToMemory ( PIX *pixs, l_uint32 **pdata, size_t *pnbytes ); """) if __name__ == '__main__':