From 58b26f6715dde2f1cdf2f9960c6986144c85eeeb Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Wed, 7 Nov 2018 01:28:54 -0800 Subject: [PATCH] Leptonica: learn to despeckle 1bpp images --- src/ocrmypdf/leptonica.py | 63 ++++++++++++++++++++++++++- src/ocrmypdf/lib/_leptonica.py | 10 ++--- src/ocrmypdf/lib/compile_leptonica.py | 43 ++++++++++++++++++ 3 files changed, 110 insertions(+), 6 deletions(-) diff --git a/src/ocrmypdf/leptonica.py b/src/ocrmypdf/leptonica.py index 80f52b27..756ba924 100644 --- a/src/ocrmypdf/leptonica.py +++ b/src/ocrmypdf/leptonica.py @@ -143,7 +143,7 @@ class LeptonicaObject: def __init__(self, cdata): if not cdata: - raise ValueError('NULL cdata object') + raise ValueError('Tried to wrap a NULL ' + self.LEPTONICA_TYPENAME) self._cdata = ffi.gc(cdata, self._destroy) @classmethod @@ -570,6 +570,35 @@ class Pix(LeptonicaObject): right, bottom = box.x + box.w, box.y + box.h yield (decoded, (left, top, right, bottom)) + def despeckle(self, size): + if size == 2: + speckle2 = """ + oooo + oC o + o o + oooo + """ + sel1 = Sel.from_selstr(speckle2, 'speckle2') + sel2 = Sel.create_brick(2, 2, 0, 0, lept.SEL_HIT) + elif size == 3: + speckle3 = """ + ooooo + oC o + o o + o o + ooooo + """ + sel1 = Sel.from_selstr(speckle3, 'speckle3') + sel2 = Sel.create_brick(3, 3, 0, 0, lept.SEL_HIT) + else: + raise ValueError(size) + + pixhmt = Pix(lept.pixHMT(ffi.NULL, self._cdata, sel1._cdata)) + pixdilated = Pix(lept.pixDilate(ffi.NULL, pixhmt._cdata, sel2._cdata)) + + pixsub = Pix(lept.pixSubtract(ffi.NULL, self._cdata, pixdilated._cdata)) + return pixsub + class CompressedData(LeptonicaObject): """Wrapper for L_COMP_DATA - abstract compressed image data""" @@ -682,6 +711,7 @@ class BoxArray(LeptonicaObject, Sequence): class StringArray(LeptonicaObject, Sequence): + """Leptonica SARRAY/string array""" LEPTONICA_TYPENAME = 'SARRAY' cdata_destroy = lept.sarrayDestroy @@ -695,6 +725,37 @@ class StringArray(LeptonicaObject, Sequence): raise IndexError(n) +class Sel(LeptonicaObject): + """Leptonica 'sel'/selection element for hit-miss transform""" + + LEPTONICA_TYPENAME = 'SEL' + cdata_destroy = lept.selDestroy + + @classmethod + def from_selstr(cls, selstr, name): + lines = [line.strip() for line in selstr.split('\n') if line.strip()] + h = len(lines) + w = len(lines[0]) + lengths = set(len(line) for line in lines) + if len(lengths) != 1: + raise ValueError("All lines in selstr must be same length") + + repacked = ''.join(line.strip() for line in lines) + buf_selstr = ffi.from_buffer(repacked.encode('ascii')) + buf_name = ffi.from_buffer(name.encode('ascii')) + sel = lept.selCreateFromString(buf_selstr, h, w, buf_name) + return cls(sel) + + @classmethod + def create_brick(cls, h, w, cy, cx, type_): + sel = lept.selCreateBrick(h, w, cy, cx, type_) + return cls(sel) + + def __repr__(self): + selstr = ffi.gc(lept.selPrintToString(self._cdata), lept.lept_free) + return '' + + @lru_cache(maxsize=1) def get_leptonica_version(): """Get Leptonica version string. diff --git a/src/ocrmypdf/lib/_leptonica.py b/src/ocrmypdf/lib/_leptonica.py index c4bc4ccd..502fd705 100644 --- a/src/ocrmypdf/lib/_leptonica.py +++ b/src/ocrmypdf/lib/_leptonica.py @@ -3,9 +3,9 @@ import _cffi_backend ffi = _cffi_backend.FFI('ocrmypdf.lib._leptonica', _version = 0x2601, - _types = b'\x00\x00\x01\x0D\x00\x01\x17\x03\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x01\x18\x03\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x01\x1B\x03\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x01\x22\x03\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x01\x1C\x03\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x04\x0D\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x09\x03\x00\x00\x1A\x11\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x01\x11\x00\x00\x01\x03\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x0D\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x0D\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x0D\x01\x00\x00\x05\x03\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x0D\x01\x00\x00\x5B\x11\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x0D\x01\x00\x00\x0D\x01\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x13\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x10\x11\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x01\x31\x03\x00\x00\x1C\x01\x00\x00\x00\x0F\x00\x00\x13\x0D\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x01\x1E\x0D\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x01\x1E\x03\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x01\x1E\x0D\x00\x00\x13\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x93\x11\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x01\x21\x0D\x00\x00\x00\x0F\x00\x00\x5B\x0D\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x09\x11\x00\x00\x04\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x32\x03\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x5B\x11\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\xAA\x11\x00\x00\xAA\x11\x00\x00\xAA\x11\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x09\x11\x00\x00\xAA\x11\x00\x00\xAA\x11\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x09\x11\x00\x00\x5B\x11\x00\x00\x5B\x11\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x0D\x01\x00\x00\x07\x01\x00\x00\x5B\x11\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x01\x19\x03\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\xAA\x11\x00\x00\xAA\x11\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x0D\x01\x00\x00\x1A\x11\x00\x00\x1A\x11\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x09\x11\x00\x01\x30\x03\x00\x00\x89\x03\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x10\x11\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\xD3\x11\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x10\x11\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x01\x2E\x03\x00\x00\xEB\x11\x00\x00\x09\x11\x00\x00\x0D\x01\x00\x00\x00\x0F\x00\x01\x34\x0D\x00\x00\x23\x11\x00\x00\x00\x0F\x00\x01\x34\x0D\x00\x00\x04\x03\x00\x00\x00\x0F\x00\x01\x34\x0D\x00\x00\xD3\x11\x00\x00\x00\x0F\x00\x01\x34\x0D\x00\x00\x1A\x11\x00\x00\x00\x0F\x00\x01\x34\x0D\x00\x00\x13\x03\x00\x00\x00\x0F\x00\x01\x34\x0D\x00\x00\x93\x11\x00\x00\x00\x0F\x00\x01\x34\x0D\x00\x01\x34\x03\x00\x00\x00\x0F\x00\x00\x00\x09\x00\x00\x01\x09\x00\x01\x1A\x03\x00\x00\x02\x09\x00\x00\x03\x09\x00\x00\x05\x09\x00\x00\x04\x09\x00\x01\x1F\x03\x00\x00\x06\x09\x00\x01\x21\x03\x00\x01\x22\x03\x00\x00\x02\x01\x00\x00\x0E\x01\x00\x00\x00\x0B\x00\x00\x01\x0B\x00\x00\x02\x0B\x00\x00\x03\x0B\x00\x00\x04\x0B\x00\x00\x05\x0B\x00\x00\x0B\x01\x00\x00\x05\x01\x00\x00\x03\x01\x00\x01\x1D\x03\x00\x01\x2F\x03\x00\x00\x04\x01\x00\x01\x31\x03\x00\x00\x08\x01\x00\x00\x0C\x01\x00\x00\x06\x01\x00\x00\x00\x01', - _globals = (b'\xFF\xFF\xFF\x0BL_BF_ANY',1,b'\xFF\xFF\xFF\x0BL_BF_CODABAR',9,b'\xFF\xFF\xFF\x0BL_BF_CODE128',2,b'\xFF\xFF\xFF\x0BL_BF_CODE2OF5',5,b'\xFF\xFF\xFF\x0BL_BF_CODE39',7,b'\xFF\xFF\xFF\x0BL_BF_CODE93',8,b'\xFF\xFF\xFF\x0BL_BF_CODEI2OF5',6,b'\xFF\xFF\xFF\x0BL_BF_EAN13',4,b'\xFF\xFF\xFF\x0BL_BF_EAN8',3,b'\xFF\xFF\xFF\x0BL_BF_UNKNOWN',0,b'\xFF\xFF\xFF\x0BL_BF_UPCA',10,b'\xFF\xFF\xFF\x0BL_CLONE',2,b'\xFF\xFF\xFF\x0BL_COPY',1,b'\xFF\xFF\xFF\x0BL_COPY_CLONE',3,b'\xFF\xFF\xFF\x0BL_DEFAULT_ENCODE',0,b'\xFF\xFF\xFF\x0BL_FLATE_ENCODE',3,b'\xFF\xFF\xFF\x0BL_G4_ENCODE',2,b'\xFF\xFF\xFF\x0BL_INSERT',0,b'\xFF\xFF\xFF\x0BL_JP2K_ENCODE',4,b'\xFF\xFF\xFF\x0BL_JPEG_ENCODE',1,b'\xFF\xFF\xFF\x0BL_NOCOPY',0,b'\xFF\xFF\xFF\x0BL_SEVERITY_ALL',1,b'\xFF\xFF\xFF\x0BL_SEVERITY_DEBUG',2,b'\xFF\xFF\xFF\x0BL_SEVERITY_ERROR',5,b'\xFF\xFF\xFF\x0BL_SEVERITY_EXTERNAL',0,b'\xFF\xFF\xFF\x0BL_SEVERITY_INFO',3,b'\xFF\xFF\xFF\x0BL_SEVERITY_NONE',6,b'\xFF\xFF\xFF\x0BL_SEVERITY_WARNING',4,b'\xFF\xFF\xFF\x0BL_USE_WIDTHS',1,b'\xFF\xFF\xFF\x0BL_USE_WINDOWS',2,b'\xFF\xFF\xFF\x0BREMOVE_CMAP_BASED_ON_SRC',4,b'\xFF\xFF\xFF\x0BREMOVE_CMAP_TO_BINARY',0,b'\xFF\xFF\xFF\x0BREMOVE_CMAP_TO_FULL_COLOR',2,b'\xFF\xFF\xFF\x0BREMOVE_CMAP_TO_GRAYSCALE',1,b'\xFF\xFF\xFF\x0BREMOVE_CMAP_WITH_ALPHA',3,b'\x00\x00\x00\x23boxClone',0,b'\x00\x01\x02\x23boxDestroy',0,b'\x00\x01\x05\x23boxaDestroy',0,b'\x00\x00\x03\x23boxaGetBox',0,b'\x00\x00\x9D\x23getLeptonicaVersion',0,b'\x00\x01\x08\x23l_CIDataDestroy',0,b'\x00\x00\xED\x23l_generateCIDataForPdf',0,b'\x00\x01\x14\x23lept_free',0,b'\x00\x00\x9F\x23makePixelSumTab8',0,b'\x00\x00\x29\x23pixAnd',0,b'\x00\x00\x36\x23pixBackgroundNorm',0,b'\x00\x00\x2E\x23pixCleanBackgroundToWhite',0,b'\x00\x00\x20\x23pixClipRectangle',0,b'\x00\x00\xD5\x23pixColorFraction',0,b'\x00\x00\x78\x23pixColorMagnitude',0,b'\x00\x00\x1D\x23pixConvertRGBToLuminance',0,b'\x00\x00\x6F\x23pixConvertTo8',0,b'\x00\x00\xA7\x23pixCorrelationBinary',0,b'\x00\x00\xC1\x23pixCountPixels',0,b'\x00\x00\x87\x23pixDeserializeFromMemory',0,b'\x00\x00\x6F\x23pixDeskew',0,b'\x00\x01\x0B\x23pixDestroy',0,b'\x00\x00\x1D\x23pixEndianByteSwapNew',0,b'\x00\x00\xAC\x23pixEqual',0,b'\x00\x00\x8B\x23pixExtractBarcodes',0,b'\x00\x00\x08\x23pixFindPageForeground',0,b'\x00\x00\xBC\x23pixFindSkew',0,b'\x00\x00\x42\x23pixGammaTRC',0,b'\x00\x00\xCE\x23pixGenerateCIData',0,b'\x00\x00\xB1\x23pixGetAverageMaskedRGB',0,b'\x00\x00\x49\x23pixGlobalNormRGB',0,b'\x00\x00\x25\x23pixInvert',0,b'\x00\x00\x17\x23pixLocateBarcodes',0,b'\x00\x00\x73\x23pixMaskOverColorPixels',0,b'\x00\x00\x51\x23pixMaskedThreshOnBackgroundNorm',0,b'\x00\x00\xC6\x23pixNumSignificantGrayColors',0,b'\x00\x00\xDE\x23pixOtsuAdaptiveThreshold',0,b'\x00\x00\x5D\x23pixOtsuThreshOnBackgroundNorm',0,b'\x00\x00\x8F\x23pixProcessBarcodes',0,b'\x00\x00\x84\x23pixRead',0,b'\x00\x00\x96\x23pixReadBarcodes',0,b'\x00\x00\x6F\x23pixRemoveColormap',0,b'\x00\x00\x73\x23pixRemoveColormapGeneral',0,b'\x00\x00\xA1\x23pixRenderBoxa',0,b'\x00\x00\x25\x23pixRotate180',0,b'\x00\x00\x6F\x23pixRotateOrth',0,b'\x00\x00\x6A\x23pixScale',0,b'\x00\x00\xE8\x23pixSerializeToMemory',0,b'\x00\x00\xF3\x23pixWriteImpliedFormat',0,b'\x00\x00\xFC\x23pixWriteMemPng',0,b'\x00\x01\x0E\x23pixaDestroy',0,b'\x00\x00\x12\x23pixaGetBox',0,b'\x00\x00\x7F\x23pixaGetPix',0,b'\x00\x01\x11\x23sarrayDestroy',0,b'\x00\x00\xF9\x23setMsgSeverity',0), - _struct_unions = ((b'\x00\x00\x01\x17\x00\x00\x00\x02Box',b'\x00\x00\x05\x11x',b'\x00\x00\x05\x11y',b'\x00\x00\x05\x11w',b'\x00\x00\x05\x11h',b'\x00\x01\x31\x11refcount'),(b'\x00\x00\x01\x18\x00\x00\x00\x02Boxa',b'\x00\x00\x05\x11n',b'\x00\x00\x05\x11nalloc',b'\x00\x01\x31\x11refcount',b'\x00\x00\x23\x11box'),(b'\x00\x00\x01\x1A\x00\x00\x00\x02L_Compressed_Data',b'\x00\x00\x05\x11type',b'\x00\x01\x2E\x11datacomp',b'\x00\x00\x89\x11nbytescomp',b'\x00\x01\x21\x11data85',b'\x00\x00\x89\x11nbytes85',b'\x00\x01\x21\x11cmapdata85',b'\x00\x01\x21\x11cmapdatahex',b'\x00\x00\x05\x11ncolors',b'\x00\x00\x05\x11w',b'\x00\x00\x05\x11h',b'\x00\x00\x05\x11bps',b'\x00\x00\x05\x11spp',b'\x00\x00\x05\x11minisblack',b'\x00\x00\x05\x11predictor',b'\x00\x00\x89\x11nbytes',b'\x00\x00\x05\x11res'),(b'\x00\x00\x01\x1B\x00\x00\x00\x02Pix',b'\x00\x01\x31\x11w',b'\x00\x01\x31\x11h',b'\x00\x01\x31\x11d',b'\x00\x01\x31\x11spp',b'\x00\x01\x31\x11wpl',b'\x00\x01\x31\x11refcount',b'\x00\x00\x05\x11xres',b'\x00\x00\x05\x11yres',b'\x00\x00\x05\x11informat',b'\x00\x00\x05\x11special',b'\x00\x01\x21\x11text',b'\x00\x01\x2D\x11colormap',b'\x00\x01\x30\x11data'),(b'\x00\x00\x01\x1D\x00\x00\x00\x02PixColormap',b'\x00\x01\x15\x11array',b'\x00\x00\x05\x11depth',b'\x00\x00\x05\x11nalloc',b'\x00\x00\x05\x11n'),(b'\x00\x00\x01\x1C\x00\x00\x00\x02Pixa',b'\x00\x00\x05\x11n',b'\x00\x00\x05\x11nalloc',b'\x00\x01\x31\x11refcount',b'\x00\x00\x1A\x11pix',b'\x00\x00\x04\x11boxa'),(b'\x00\x00\x01\x1F\x00\x00\x00\x02Sarray',b'\x00\x00\x05\x11nalloc',b'\x00\x00\x05\x11n',b'\x00\x00\x05\x11refcount',b'\x00\x01\x20\x11array')), - _enums = (b'\x00\x00\x01\x24\x00\x00\x00\x16$1\x00L_DEFAULT_ENCODE,L_JPEG_ENCODE,L_G4_ENCODE,L_FLATE_ENCODE,L_JP2K_ENCODE',b'\x00\x00\x01\x25\x00\x00\x00\x16$2\x00REMOVE_CMAP_TO_BINARY,REMOVE_CMAP_TO_GRAYSCALE,REMOVE_CMAP_TO_FULL_COLOR,REMOVE_CMAP_WITH_ALPHA,REMOVE_CMAP_BASED_ON_SRC',b'\x00\x00\x01\x26\x00\x00\x00\x16$3\x00L_NOCOPY,L_INSERT,L_COPY,L_CLONE,L_COPY_CLONE',b'\x00\x00\x01\x27\x00\x00\x00\x16$4\x00L_USE_WIDTHS,L_USE_WINDOWS',b'\x00\x00\x01\x28\x00\x00\x00\x16$5\x00L_BF_UNKNOWN,L_BF_ANY,L_BF_CODE128,L_BF_EAN8,L_BF_EAN13,L_BF_CODE2OF5,L_BF_CODEI2OF5,L_BF_CODE39,L_BF_CODE93,L_BF_CODABAR,L_BF_UPCA',b'\x00\x00\x01\x29\x00\x00\x00\x16$6\x00L_SEVERITY_EXTERNAL,L_SEVERITY_ALL,L_SEVERITY_DEBUG,L_SEVERITY_INFO,L_SEVERITY_WARNING,L_SEVERITY_ERROR,L_SEVERITY_NONE'), - _typenames = (b'\x00\x00\x01\x17BOX',b'\x00\x00\x01\x18BOXA',b'\x00\x00\x01\x1AL_COMP_DATA',b'\x00\x00\x01\x1BPIX',b'\x00\x00\x01\x1CPIXA',b'\x00\x00\x01\x1DPIXCMAP',b'\x00\x00\x01\x1FSARRAY',b'\x00\x00\x00\x32l_float32',b'\x00\x00\x01\x23l_float64',b'\x00\x00\x01\x2Bl_int16',b'\x00\x00\x00\x05l_int32',b'\x00\x00\x01\x2Al_int64',b'\x00\x00\x01\x2Cl_int8',b'\x00\x00\x00\x05l_ok',b'\x00\x00\x01\x33l_uint16',b'\x00\x00\x01\x31l_uint32',b'\x00\x00\x01\x32l_uint64',b'\x00\x00\x01\x2Fl_uint8'), + _types = b'\x00\x00\x01\x0D\x00\x01\x2F\x03\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x01\x30\x03\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x01\x33\x03\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x01\x3B\x03\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x01\x34\x03\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x04\x0D\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x09\x03\x00\x00\x1A\x11\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x01\x11\x00\x00\x01\x03\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x0D\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x09\x11\x00\x01\x38\x03\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x0D\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x0D\x01\x00\x00\x05\x03\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x0D\x01\x00\x00\x60\x11\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x0D\x01\x00\x00\x0D\x01\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x13\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x10\x11\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x01\x4C\x03\x00\x00\x1C\x01\x00\x00\x00\x0F\x00\x00\x13\x0D\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x01\x36\x0D\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x01\x36\x03\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x01\x36\x0D\x00\x00\x13\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x98\x11\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x45\x0D\x00\x00\x10\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x10\x11\x00\x00\x00\x0F\x00\x00\x45\x0D\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x01\x3A\x0D\x00\x00\x45\x11\x00\x00\x00\x0F\x00\x01\x3A\x0D\x00\x00\x00\x0F\x00\x00\x60\x0D\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x09\x11\x00\x00\x04\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x32\x03\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x60\x11\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\xBF\x11\x00\x00\xBF\x11\x00\x00\xBF\x11\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x09\x11\x00\x00\xBF\x11\x00\x00\xBF\x11\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x09\x11\x00\x00\x60\x11\x00\x00\x60\x11\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x0D\x01\x00\x00\x07\x01\x00\x00\x60\x11\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x01\x31\x03\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\xBF\x11\x00\x00\xBF\x11\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x0D\x01\x00\x00\x1A\x11\x00\x00\x1A\x11\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x09\x11\x00\x01\x4B\x03\x00\x00\x8E\x03\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x10\x11\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\xE8\x11\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x10\x11\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x01\x49\x03\x00\x01\x00\x11\x00\x00\x09\x11\x00\x00\x0D\x01\x00\x00\x00\x0F\x00\x01\x4F\x0D\x00\x00\x23\x11\x00\x00\x00\x0F\x00\x01\x4F\x0D\x00\x00\x04\x03\x00\x00\x00\x0F\x00\x01\x4F\x0D\x00\x00\xE8\x11\x00\x00\x00\x0F\x00\x01\x4F\x0D\x00\x00\x1A\x11\x00\x00\x00\x0F\x00\x01\x4F\x0D\x00\x00\x13\x03\x00\x00\x00\x0F\x00\x01\x4F\x0D\x00\x00\x98\x11\x00\x00\x00\x0F\x00\x01\x4F\x0D\x00\x00\x45\x03\x00\x00\x00\x0F\x00\x01\x4F\x0D\x00\x01\x4F\x03\x00\x00\x00\x0F\x00\x00\x00\x09\x00\x00\x01\x09\x00\x01\x32\x03\x00\x00\x02\x09\x00\x00\x03\x09\x00\x00\x05\x09\x00\x00\x04\x09\x00\x01\x37\x03\x00\x00\x06\x09\x00\x00\x07\x09\x00\x01\x3A\x03\x00\x01\x3B\x03\x00\x00\x02\x01\x00\x00\x0E\x01\x00\x00\x00\x0B\x00\x00\x01\x0B\x00\x00\x02\x0B\x00\x00\x03\x0B\x00\x00\x04\x0B\x00\x00\x05\x0B\x00\x00\x06\x0B\x00\x00\x60\x03\x00\x00\x0B\x01\x00\x00\x05\x01\x00\x00\x03\x01\x00\x01\x35\x03\x00\x01\x4A\x03\x00\x00\x04\x01\x00\x01\x4C\x03\x00\x00\x08\x01\x00\x00\x0C\x01\x00\x00\x06\x01\x00\x00\x00\x01', + _globals = (b'\xFF\xFF\xFF\x0BL_BF_ANY',1,b'\xFF\xFF\xFF\x0BL_BF_CODABAR',9,b'\xFF\xFF\xFF\x0BL_BF_CODE128',2,b'\xFF\xFF\xFF\x0BL_BF_CODE2OF5',5,b'\xFF\xFF\xFF\x0BL_BF_CODE39',7,b'\xFF\xFF\xFF\x0BL_BF_CODE93',8,b'\xFF\xFF\xFF\x0BL_BF_CODEI2OF5',6,b'\xFF\xFF\xFF\x0BL_BF_EAN13',4,b'\xFF\xFF\xFF\x0BL_BF_EAN8',3,b'\xFF\xFF\xFF\x0BL_BF_UNKNOWN',0,b'\xFF\xFF\xFF\x0BL_BF_UPCA',10,b'\xFF\xFF\xFF\x0BL_CLONE',2,b'\xFF\xFF\xFF\x0BL_COPY',1,b'\xFF\xFF\xFF\x0BL_COPY_CLONE',3,b'\xFF\xFF\xFF\x0BL_DEFAULT_ENCODE',0,b'\xFF\xFF\xFF\x0BL_FLATE_ENCODE',3,b'\xFF\xFF\xFF\x0BL_G4_ENCODE',2,b'\xFF\xFF\xFF\x0BL_INSERT',0,b'\xFF\xFF\xFF\x0BL_JP2K_ENCODE',4,b'\xFF\xFF\xFF\x0BL_JPEG_ENCODE',1,b'\xFF\xFF\xFF\x0BL_NOCOPY',0,b'\xFF\xFF\xFF\x0BL_SEVERITY_ALL',1,b'\xFF\xFF\xFF\x0BL_SEVERITY_DEBUG',2,b'\xFF\xFF\xFF\x0BL_SEVERITY_ERROR',5,b'\xFF\xFF\xFF\x0BL_SEVERITY_EXTERNAL',0,b'\xFF\xFF\xFF\x0BL_SEVERITY_INFO',3,b'\xFF\xFF\xFF\x0BL_SEVERITY_NONE',6,b'\xFF\xFF\xFF\x0BL_SEVERITY_WARNING',4,b'\xFF\xFF\xFF\x0BL_USE_WIDTHS',1,b'\xFF\xFF\xFF\x0BL_USE_WINDOWS',2,b'\xFF\xFF\xFF\x0BREMOVE_CMAP_BASED_ON_SRC',4,b'\xFF\xFF\xFF\x0BREMOVE_CMAP_TO_BINARY',0,b'\xFF\xFF\xFF\x0BREMOVE_CMAP_TO_FULL_COLOR',2,b'\xFF\xFF\xFF\x0BREMOVE_CMAP_TO_GRAYSCALE',1,b'\xFF\xFF\xFF\x0BREMOVE_CMAP_WITH_ALPHA',3,b'\xFF\xFF\xFF\x0BSEL_DONT_CARE',0,b'\xFF\xFF\xFF\x0BSEL_HIT',1,b'\xFF\xFF\xFF\x0BSEL_MISS',2,b'\x00\x00\x00\x23boxClone',0,b'\x00\x01\x17\x23boxDestroy',0,b'\x00\x01\x1A\x23boxaDestroy',0,b'\x00\x00\x03\x23boxaGetBox',0,b'\x00\x00\xB2\x23getLeptonicaVersion',0,b'\x00\x01\x1D\x23l_CIDataDestroy',0,b'\x00\x01\x02\x23l_generateCIDataForPdf',0,b'\x00\x01\x2C\x23lept_free',0,b'\x00\x00\xB4\x23makePixelSumTab8',0,b'\x00\x00\x29\x23pixAnd',0,b'\x00\x00\x36\x23pixBackgroundNorm',0,b'\x00\x00\x2E\x23pixCleanBackgroundToWhite',0,b'\x00\x00\x20\x23pixClipRectangle',0,b'\x00\x00\xEA\x23pixColorFraction',0,b'\x00\x00\x7D\x23pixColorMagnitude',0,b'\x00\x00\x1D\x23pixConvertRGBToLuminance',0,b'\x00\x00\x74\x23pixConvertTo8',0,b'\x00\x00\xBC\x23pixCorrelationBinary',0,b'\x00\x00\xD6\x23pixCountPixels',0,b'\x00\x00\x8C\x23pixDeserializeFromMemory',0,b'\x00\x00\x74\x23pixDeskew',0,b'\x00\x01\x20\x23pixDestroy',0,b'\x00\x00\x42\x23pixDilate',0,b'\x00\x00\x1D\x23pixEndianByteSwapNew',0,b'\x00\x00\xC1\x23pixEqual',0,b'\x00\x00\x42\x23pixErode',0,b'\x00\x00\x90\x23pixExtractBarcodes',0,b'\x00\x00\x08\x23pixFindPageForeground',0,b'\x00\x00\xD1\x23pixFindSkew',0,b'\x00\x00\x47\x23pixGammaTRC',0,b'\x00\x00\xE3\x23pixGenerateCIData',0,b'\x00\x00\xC6\x23pixGetAverageMaskedRGB',0,b'\x00\x00\x4E\x23pixGlobalNormRGB',0,b'\x00\x00\x42\x23pixHMT',0,b'\x00\x00\x25\x23pixInvert',0,b'\x00\x00\x17\x23pixLocateBarcodes',0,b'\x00\x00\x78\x23pixMaskOverColorPixels',0,b'\x00\x00\x56\x23pixMaskedThreshOnBackgroundNorm',0,b'\x00\x00\xDB\x23pixNumSignificantGrayColors',0,b'\x00\x00\xF3\x23pixOtsuAdaptiveThreshold',0,b'\x00\x00\x62\x23pixOtsuThreshOnBackgroundNorm',0,b'\x00\x00\x94\x23pixProcessBarcodes',0,b'\x00\x00\x89\x23pixRead',0,b'\x00\x00\x9B\x23pixReadBarcodes',0,b'\x00\x00\x74\x23pixRemoveColormap',0,b'\x00\x00\x78\x23pixRemoveColormapGeneral',0,b'\x00\x00\xB6\x23pixRenderBoxa',0,b'\x00\x00\x25\x23pixRotate180',0,b'\x00\x00\x74\x23pixRotateOrth',0,b'\x00\x00\x6F\x23pixScale',0,b'\x00\x00\xFD\x23pixSerializeToMemory',0,b'\x00\x00\x29\x23pixSubtract',0,b'\x00\x01\x08\x23pixWriteImpliedFormat',0,b'\x00\x01\x11\x23pixWriteMemPng',0,b'\x00\x01\x23\x23pixaDestroy',0,b'\x00\x00\x12\x23pixaGetBox',0,b'\x00\x00\x84\x23pixaGetPix',0,b'\x00\x01\x26\x23sarrayDestroy',0,b'\x00\x00\xA8\x23selCreateBrick',0,b'\x00\x00\xA2\x23selCreateFromString',0,b'\x00\x01\x29\x23selDestroy',0,b'\x00\x00\xAF\x23selPrintToString',0,b'\x00\x01\x0E\x23setMsgSeverity',0), + _struct_unions = ((b'\x00\x00\x01\x2F\x00\x00\x00\x02Box',b'\x00\x00\x05\x11x',b'\x00\x00\x05\x11y',b'\x00\x00\x05\x11w',b'\x00\x00\x05\x11h',b'\x00\x01\x4C\x11refcount'),(b'\x00\x00\x01\x30\x00\x00\x00\x02Boxa',b'\x00\x00\x05\x11n',b'\x00\x00\x05\x11nalloc',b'\x00\x01\x4C\x11refcount',b'\x00\x00\x23\x11box'),(b'\x00\x00\x01\x32\x00\x00\x00\x02L_Compressed_Data',b'\x00\x00\x05\x11type',b'\x00\x01\x49\x11datacomp',b'\x00\x00\x8E\x11nbytescomp',b'\x00\x01\x3A\x11data85',b'\x00\x00\x8E\x11nbytes85',b'\x00\x01\x3A\x11cmapdata85',b'\x00\x01\x3A\x11cmapdatahex',b'\x00\x00\x05\x11ncolors',b'\x00\x00\x05\x11w',b'\x00\x00\x05\x11h',b'\x00\x00\x05\x11bps',b'\x00\x00\x05\x11spp',b'\x00\x00\x05\x11minisblack',b'\x00\x00\x05\x11predictor',b'\x00\x00\x8E\x11nbytes',b'\x00\x00\x05\x11res'),(b'\x00\x00\x01\x33\x00\x00\x00\x02Pix',b'\x00\x01\x4C\x11w',b'\x00\x01\x4C\x11h',b'\x00\x01\x4C\x11d',b'\x00\x01\x4C\x11spp',b'\x00\x01\x4C\x11wpl',b'\x00\x01\x4C\x11refcount',b'\x00\x00\x05\x11xres',b'\x00\x00\x05\x11yres',b'\x00\x00\x05\x11informat',b'\x00\x00\x05\x11special',b'\x00\x01\x3A\x11text',b'\x00\x01\x48\x11colormap',b'\x00\x01\x4B\x11data'),(b'\x00\x00\x01\x35\x00\x00\x00\x02PixColormap',b'\x00\x01\x2D\x11array',b'\x00\x00\x05\x11depth',b'\x00\x00\x05\x11nalloc',b'\x00\x00\x05\x11n'),(b'\x00\x00\x01\x34\x00\x00\x00\x02Pixa',b'\x00\x00\x05\x11n',b'\x00\x00\x05\x11nalloc',b'\x00\x01\x4C\x11refcount',b'\x00\x00\x1A\x11pix',b'\x00\x00\x04\x11boxa'),(b'\x00\x00\x01\x37\x00\x00\x00\x02Sarray',b'\x00\x00\x05\x11nalloc',b'\x00\x00\x05\x11n',b'\x00\x00\x05\x11refcount',b'\x00\x01\x39\x11array'),(b'\x00\x00\x01\x38\x00\x00\x00\x02Sel',b'\x00\x00\x05\x11sy',b'\x00\x00\x05\x11sx',b'\x00\x00\x05\x11cy',b'\x00\x00\x05\x11cx',b'\x00\x01\x44\x11data',b'\x00\x01\x3A\x11name')), + _enums = (b'\x00\x00\x01\x3D\x00\x00\x00\x16$1\x00L_DEFAULT_ENCODE,L_JPEG_ENCODE,L_G4_ENCODE,L_FLATE_ENCODE,L_JP2K_ENCODE',b'\x00\x00\x01\x3E\x00\x00\x00\x16$2\x00REMOVE_CMAP_TO_BINARY,REMOVE_CMAP_TO_GRAYSCALE,REMOVE_CMAP_TO_FULL_COLOR,REMOVE_CMAP_WITH_ALPHA,REMOVE_CMAP_BASED_ON_SRC',b'\x00\x00\x01\x3F\x00\x00\x00\x16$3\x00L_NOCOPY,L_INSERT,L_COPY,L_CLONE,L_COPY_CLONE',b'\x00\x00\x01\x40\x00\x00\x00\x16$4\x00L_USE_WIDTHS,L_USE_WINDOWS',b'\x00\x00\x01\x41\x00\x00\x00\x16$5\x00L_BF_UNKNOWN,L_BF_ANY,L_BF_CODE128,L_BF_EAN8,L_BF_EAN13,L_BF_CODE2OF5,L_BF_CODEI2OF5,L_BF_CODE39,L_BF_CODE93,L_BF_CODABAR,L_BF_UPCA',b'\x00\x00\x01\x42\x00\x00\x00\x16$6\x00L_SEVERITY_EXTERNAL,L_SEVERITY_ALL,L_SEVERITY_DEBUG,L_SEVERITY_INFO,L_SEVERITY_WARNING,L_SEVERITY_ERROR,L_SEVERITY_NONE',b'\x00\x00\x01\x43\x00\x00\x00\x16$7\x00SEL_DONT_CARE,SEL_HIT,SEL_MISS'), + _typenames = (b'\x00\x00\x01\x2FBOX',b'\x00\x00\x01\x30BOXA',b'\x00\x00\x01\x32L_COMP_DATA',b'\x00\x00\x01\x33PIX',b'\x00\x00\x01\x34PIXA',b'\x00\x00\x01\x35PIXCMAP',b'\x00\x00\x01\x37SARRAY',b'\x00\x00\x01\x38SEL',b'\x00\x00\x00\x32l_float32',b'\x00\x00\x01\x3Cl_float64',b'\x00\x00\x01\x46l_int16',b'\x00\x00\x00\x05l_int32',b'\x00\x00\x01\x45l_int64',b'\x00\x00\x01\x47l_int8',b'\x00\x00\x00\x05l_ok',b'\x00\x00\x01\x4El_uint16',b'\x00\x00\x01\x4Cl_uint32',b'\x00\x00\x01\x4Dl_uint64',b'\x00\x00\x01\x4Al_uint8'), ) diff --git a/src/ocrmypdf/lib/compile_leptonica.py b/src/ocrmypdf/lib/compile_leptonica.py index ff1e63b0..87712db2 100644 --- a/src/ocrmypdf/lib/compile_leptonica.py +++ b/src/ocrmypdf/lib/compile_leptonica.py @@ -135,6 +135,18 @@ struct L_Compressed_Data }; typedef struct L_Compressed_Data L_COMP_DATA; +/*! Selection */ +struct Sel +{ + l_int32 sy; /*!< sel height */ + l_int32 sx; /*!< sel width */ + l_int32 cy; /*!< y location of sel origin */ + l_int32 cx; /*!< x location of sel origin */ + l_int32 **data; /*!< {0,1,2}; data[i][j] in [row][col] order */ + char *name; /*!< used to find sel by name */ +}; +typedef struct Sel SEL; + enum { REMOVE_CMAP_TO_BINARY = 0, /*!< remove colormap for conv to 1 bpp */ REMOVE_CMAP_TO_GRAYSCALE = 1, /*!< remove colormap for conv to 8 bpp */ @@ -184,6 +196,12 @@ enum { L_SEVERITY_NONE = 6 /* Highest severity: print no messages */ }; +enum { + SEL_DONT_CARE = 0, + SEL_HIT = 1, + SEL_MISS = 2 +}; + """) ffibuilder.cdef(""" @@ -407,12 +425,34 @@ l_generateCIDataForPdf(const char *fname, l_int32 quality, L_COMP_DATA **pcid); + BOX * boxClone ( BOX *box ); BOX * boxaGetBox ( BOXA *boxa, l_int32 index, l_int32 accessflag ); +SEL * +selCreateFromString ( const char *text, l_int32 h, l_int32 w, const char *name ); + +SEL * +selCreateBrick ( l_int32 h, l_int32 w, l_int32 cy, l_int32 cx, l_int32 type ); + +char * +selPrintToString(SEL *sel); + +PIX * +pixDilate ( PIX *pixd, PIX *pixs, SEL *sel ); + +PIX * +pixErode ( PIX *pixd, PIX *pixs, SEL *sel ); + +PIX * +pixHMT ( PIX *pixd, PIX *pixs, SEL *sel ); + +PIX * +pixSubtract ( PIX *pixd, PIX *pixs1, PIX *pixs2 ); + void boxDestroy(BOX **pbox); @@ -434,8 +474,11 @@ sarrayDestroy(SARRAY **psa); void lept_free(void *ptr); +void selDestroy ( SEL **psel ); + l_int32 setMsgSeverity(l_int32 newsev); + """)