+ * This file has typedefs for the following array structs: + * struct Numa array of floats + * struct Numaa + * struct L_Dna array of doubles + * struct L_Dnaa + * struct L_Dnahash + * struct Sarray array of C-strings + * struct L_Bytea array of bytes + * + * It contains definitions for: + * Numa interpolation flags + * Numa border flags + * Numa data type conversion to string + * + * Here are the non-image-related arrays in leptonica: + * * Numa, L_Dna, L_Ptra, Sarray: + * These have most of the typical operations of vectors, such as add, + * insert, remove and replace. + * * Numaa, L_Dnaa, L_Ptraa: + * These are arrays of float, double and generic pointer arrays. + * * L_Bytea: + * This is an array of bytes, analogous to a C++ string. + * * L_Dnahash: + * This is a simple hashing for integers, used in the jbig2 classifier. + *+ */ + + +/*------------------------------------------------------------------------* + * Array Structs * + *------------------------------------------------------------------------*/ + /*! Number array: an array of floats */ +typedef struct Numa NUMA; + + /*! Array of number arrays */ +typedef struct Numaa NUMAA; + + /*! Double number array: an array of doubles */ +typedef struct L_Dna L_DNA; + + /*! Array of double number arrays */ +typedef struct L_Dnaa L_DNAA; + + /*! Array of double number arrays, used as a simple hash */ +typedef struct L_DnaHash L_DNAHASH; + + /*! String array: an array of C strings */ +typedef struct Sarray SARRAY; + + /*! Byte array (analogous to C++ "string") */ +typedef struct L_Bytea L_BYTEA; + + +/*------------------------------------------------------------------------* + * Array flags * + *------------------------------------------------------------------------*/ +/*! Numa Interpolation */ +enum { + L_LINEAR_INTERP = 1, /*!< linear */ + L_QUADRATIC_INTERP = 2 /*!< quadratic */ +}; + +/*! Numa Border Adding */ +enum { + L_CONTINUED_BORDER = 1, /*!< extended with same value */ + L_SLOPE_BORDER = 2, /*!< extended with constant normal derivative */ + L_MIRRORED_BORDER = 3 /*!< mirrored */ +}; + +/*! Numa Data Conversion */ +enum { + L_INTEGER_VALUE = 1, /*!< convert to integer */ + L_FLOAT_VALUE = 2 /*!< convert to float */ +}; + +#endif /* LEPTONICA_ARRAY_H */ diff --git a/third_party/leptonica/uos/amd64/include/leptonica/array_internal.h b/third_party/leptonica/uos/amd64/include/leptonica/array_internal.h new file mode 100644 index 00000000..355c59d0 --- /dev/null +++ b/third_party/leptonica/uos/amd64/include/leptonica/array_internal.h @@ -0,0 +1,135 @@ +/*====================================================================* + - Copyright (C) 2001 Leptonica. All rights reserved. + - + - Redistribution and use in source and binary forms, with or without + - modification, are permitted provided that the following conditions + - are met: + - 1. Redistributions of source code must retain the above copyright + - notice, this list of conditions and the following disclaimer. + - 2. Redistributions in binary form must reproduce the above + - copyright notice, this list of conditions and the following + - disclaimer in the documentation and/or other materials + - provided with the distribution. + - + - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ANY + - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *====================================================================*/ + +#ifndef LEPTONICA_ARRAY_INTERNAL_H +#define LEPTONICA_ARRAY_INTERNAL_H + +/*! + * \file array_internal.h + * + *
+ * Contains the following structs: + * struct Numa array of floats + * struct Numaa + * struct L_Dna array of doubles + * struct L_Dnaa + * struct L_Dnahash + * struct Sarray array of C-strings + * struct L_Bytea array of bytes + * + * This file can be #included after allheaders.h in source files that + * require direct access to the internal data fields in these structs. + * + * Here are the non-image-related arrays in leptonica: + * * Numa, L_Dna, L_Ptra, Sarray: + * These have most of the typical operations of vectors, such as add, + * insert, remove and replace. + * * Numaa, L_Dnaa, L_Ptraa: + * These are arrays of float, double and generic pointer arrays. + * * L_Bytea: + * This is an array of bytes, analogous to a C++ string. + * * L_Dnahash: + * This is a simple hashing for integers, used in the jbig2 classifier. + *+ */ + + +/*------------------------------------------------------------------------* + * Array Structs * + *------------------------------------------------------------------------*/ +/*! Numa version for serialization */ +#define NUMA_VERSION_NUMBER 1 + + /*! Number array: an array of floats */ +struct Numa +{ + l_int32 nalloc; /*!< size of allocated number array */ + l_int32 n; /*!< number of numbers saved */ + l_atomic refcount; /*!< reference count (1 if no clones) */ + l_float32 startx; /*!< x value assigned to array[0] */ + l_float32 delx; /*!< change in x value as i --> i + 1 */ + l_float32 *array; /*!< number array */ +}; + + /*! Array of number arrays */ +struct Numaa +{ + l_int32 nalloc; /*!< size of allocated ptr array */ + l_int32 n; /*!< number of Numa saved */ + struct Numa **numa; /*!< array of Numa */ +}; + +/*! Dna version for serialization */ +#define DNA_VERSION_NUMBER 1 + + /*! Double number array: an array of doubles */ +struct L_Dna +{ + l_int32 nalloc; /*!< size of allocated number array */ + l_int32 n; /*!< number of numbers saved */ + l_atomic refcount; /*!< reference count (1 if no clones) */ + l_float64 startx; /*!< x value assigned to array[0] */ + l_float64 delx; /*!< change in x value as i --> i + 1 */ + l_float64 *array; /*!< number array */ +}; + + /*! Array of double number arrays */ +struct L_Dnaa +{ + l_int32 nalloc; /*!< size of allocated ptr array */ + l_int32 n; /*!< number of L_Dna saved */ + struct L_Dna **dna; /*!< array of L_Dna */ +}; + +struct L_DnaHash +{ + l_int32 nbuckets; + l_int32 initsize; /*!< initial size of each dna that is made */ + struct L_Dna **dna; /*!< array of L_Dna */ +}; + +/*! Sarray version for serialization */ +#define SARRAY_VERSION_NUMBER 1 + + /*! String array: an array of C strings */ +struct Sarray +{ + l_int32 nalloc; /*!< size of allocated ptr array */ + l_int32 n; /*!< number of strings allocated */ + l_atomic refcount; /*!< reference count (1 if no clones) */ + char **array; /*!< string array */ +}; + + /*! Byte array (analogous to C++ "string") */ +struct L_Bytea +{ + size_t nalloc; /*!< number of bytes allocated in data array */ + size_t size; /*!< number of bytes presently used */ + l_atomic refcount; /*!< reference count (1 if no clones) */ + l_uint8 *data; /*!< data array */ +}; + +#endif /* LEPTONICA_ARRAY_INTERNAL_H */ diff --git a/third_party/leptonica/uos/amd64/include/leptonica/arrayaccess.h b/third_party/leptonica/uos/amd64/include/leptonica/arrayaccess.h new file mode 100644 index 00000000..1a831bcc --- /dev/null +++ b/third_party/leptonica/uos/amd64/include/leptonica/arrayaccess.h @@ -0,0 +1,270 @@ +/*====================================================================* + - Copyright (C) 2001 Leptonica. All rights reserved. + - + - Redistribution and use in source and binary forms, with or without + - modification, are permitted provided that the following conditions + - are met: + - 1. Redistributions of source code must retain the above copyright + - notice, this list of conditions and the following disclaimer. + - 2. Redistributions in binary form must reproduce the above + - copyright notice, this list of conditions and the following + - disclaimer in the documentation and/or other materials + - provided with the distribution. + - + - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ANY + - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *====================================================================*/ + +#ifndef LEPTONICA_ARRAY_ACCESS_H +#define LEPTONICA_ARRAY_ACCESS_H + +/*! + * \file arrayaccess.h + * + *
+ * 1, 2, 4, 8, 16 and 32 bit data access within an array of 32-bit words + * + * This is used primarily to access 1, 2, 4, 8, 16 and 32 bit pixels + * in a line of image data, represented as an array of 32-bit words. + * + * pdata: pointer to first 32-bit word in the array + * n: index of the pixel in the array + * + * Function calls for these accessors are defined in arrayaccess.c. + * + * However, for efficiency we use the inline macros for all accesses. + * Even though the 2 and 4 bit set* accessors are more complicated, + * they are about 10% faster than the function calls. + * + * The 32 bit access is just a cast and ptr arithmetic. We include + * it so that the input ptr can be void*. + * + * At the end of this file is code for invoking the function calls + * instead of inlining. + * + * The macro SET_DATA_BIT_VAL(pdata, n, val) is a bit slower than + * if (val == 0) + * CLEAR_DATA_BIT(pdata, n); + * else + * SET_DATA_BIT(pdata, n); + * + * Some compilers complain when the SET macros are surrounded by + * parentheses, because parens require an evaluation and it is not + * defined for SET macros. If SET_DATA_QBIT were defined as a + * compound macro, in analogy to l_setDataQbit(), it requires + * surrounding braces: + * \code + * #define SET_DATA_QBIT(pdata, n, val) \ + * {l_uint32 *_TEMP_WORD_PTR_; \ + * _TEMP_WORD_PTR_ = (l_uint32 *)(pdata) + ((n) >> 3); \ + * *_TEMP_WORD_PTR_ &= ~(0xf0000000 >> (4 * ((n) & 7))); \ + * *_TEMP_WORD_PTR_ |= (((val) & 15) << (28 - 4 * ((n) & 7)));} + * \endcode + * but if used in an if/else + * \code + * if (x) + * SET_DATA_QBIT(...); + * else + * ... + * \endcode + * the compiler sees + * \code + * if (x) + * {......}; + * else + * ... + * \endcode + * The semicolon comes after the brace and will not compile. + * This can be fixed in the call by either omitting the semicolon + * or requiring another set of braces around SET_DATA_QBIT(), but + * both these options break compatibility with current code, and + * require special attention by anyone using the macros. + * + * There are (at least) two ways to fix this in the macro definitions, + * suggested by Dave Bryan. + * (1) Surround the braces in the macro above with + * do {....} while(0) + * Then the semicolon just terminates the expression. + * (2) Reduce the blocks to a single expression; e.g, + * *((l_uint32 *)(pdata) + ((n) >> 3)) = \ + * *((l_uint32 *)(pdata) + ((n) >> 3)) \ + * & ~(0xf0000000 >> (4 * ((n) & 7))) \ + * | (((val) & 15) << (28 - 4 * ((n) & 7))) + * This appears to cause redundant computation, but the compiler + * should evaluate the common subexpression only once. + * All these methods have the same performance, giving about 300M + * SET_DATA_QBIT operations per second on a fast 64 bit system. + * Using the function calls instead of the macros results in about 250M + * SET_DATA_QBIT operations per second, a performance hit of nearly 20%. + *+ */ + +#define USE_INLINE_ACCESSORS 1 + +#if USE_INLINE_ACCESSORS + + /*=============================================================*/ + /* Faster: use in line accessors */ + /*=============================================================*/ + + /*--------------------------------------------------* + * 1 bit access * + *--------------------------------------------------*/ +/*! 1 bit access - get */ +#define GET_DATA_BIT(pdata, n) \ + ((*((const l_uint32 *)(pdata) + ((n) >> 5)) >> (31 - ((n) & 31))) & 1) + +/*! 1 bit access - set */ +#define SET_DATA_BIT(pdata, n) \ + *((l_uint32 *)(pdata) + ((n) >> 5)) |= (0x80000000 >> ((n) & 31)) + +/*! 1 bit access - clear */ +#define CLEAR_DATA_BIT(pdata, n) \ + *((l_uint32 *)(pdata) + ((n) >> 5)) &= ~(0x80000000 >> ((n) & 31)) + +/*! 1 bit access - set value (0 or 1) */ +#define SET_DATA_BIT_VAL(pdata, n, val) \ + *((l_uint32 *)(pdata) + ((n) >> 5)) = \ + ((*((l_uint32 *)(pdata) + ((n) >> 5)) \ + & (~(0x80000000 >> ((n) & 31)))) \ + | ((l_uint32)(val) << (31 - ((n) & 31)))) + + /*--------------------------------------------------* + * 2 bit access * + *--------------------------------------------------*/ +/*! 2 bit access - get */ +#define GET_DATA_DIBIT(pdata, n) \ + ((*((const l_uint32 *)(pdata) + ((n) >> 4)) >> (2 * (15 - ((n) & 15)))) & 3) + +/*! 2 bit access - set value (0 ... 3) */ +#define SET_DATA_DIBIT(pdata, n, val) \ + *((l_uint32 *)(pdata) + ((n) >> 4)) = \ + ((*((l_uint32 *)(pdata) + ((n) >> 4)) \ + & (~(0xc0000000 >> (2 * ((n) & 15))))) \ + | ((l_uint32)((val) & 3) << (30 - 2 * ((n) & 15)))) + +/*! 2 bit access - clear */ +#define CLEAR_DATA_DIBIT(pdata, n) \ + *((l_uint32 *)(pdata) + ((n) >> 4)) &= ~(0xc0000000 >> (2 * ((n) & 15))) + + + /*--------------------------------------------------* + * 4 bit access * + *--------------------------------------------------*/ +/*! 4 bit access - get */ +#define GET_DATA_QBIT(pdata, n) \ + ((*((const l_uint32 *)(pdata) + ((n) >> 3)) >> (4 * (7 - ((n) & 7)))) & 0xf) + +/*! 4 bit access - set value (0 ... 15) */ +#define SET_DATA_QBIT(pdata, n, val) \ + *((l_uint32 *)(pdata) + ((n) >> 3)) = \ + ((*((l_uint32 *)(pdata) + ((n) >> 3)) \ + & (~(0xf0000000 >> (4 * ((n) & 7))))) \ + | ((l_uint32)((val) & 15) << (28 - 4 * ((n) & 7)))) + +/*! 4 bit access - clear */ +#define CLEAR_DATA_QBIT(pdata, n) \ + *((l_uint32 *)(pdata) + ((n) >> 3)) &= ~(0xf0000000 >> (4 * ((n) & 7))) + + + /*--------------------------------------------------* + * 8 bit access * + *--------------------------------------------------*/ +#ifdef L_BIG_ENDIAN +/*! 8 bit access - get */ +#define GET_DATA_BYTE(pdata, n) \ + (*((const l_uint8 *)(pdata) + (n))) +#else /* L_LITTLE_ENDIAN */ +/*! 8 bit access - get */ +#define GET_DATA_BYTE(pdata, n) \ + (*(l_uint8 *)((l_uintptr_t)((const l_uint8 *)(pdata) + (n)) ^ 3)) +#endif /* L_BIG_ENDIAN */ + +#ifdef L_BIG_ENDIAN +/*! 8 bit access - set value (0 ... 255) */ +#define SET_DATA_BYTE(pdata, n, val) \ + *((l_uint8 *)(pdata) + (n)) = (val) +#else /* L_LITTLE_ENDIAN */ +/*! 8 bit access - set value (0 ... 255) */ +#define SET_DATA_BYTE(pdata, n, val) \ + *(l_uint8 *)((l_uintptr_t)((l_uint8 *)(pdata) + (n)) ^ 3) = (val) +#endif /* L_BIG_ENDIAN */ + + + /*--------------------------------------------------* + * 16 bit access * + *--------------------------------------------------*/ +#ifdef L_BIG_ENDIAN +/*! 16 bit access - get */ +#define GET_DATA_TWO_BYTES(pdata, n) \ + (*((const l_uint16 *)(pdata) + (n))) +#else /* L_LITTLE_ENDIAN */ +/*! 16 bit access - get */ +#define GET_DATA_TWO_BYTES(pdata, n) \ + (*(l_uint16 *)((l_uintptr_t)((const l_uint16 *)(pdata) + (n)) ^ 2)) +#endif /* L_BIG_ENDIAN */ + +#ifdef L_BIG_ENDIAN +/*! 16 bit access - set value (0 ... 65535) */ +#define SET_DATA_TWO_BYTES(pdata, n, val) \ + *((l_uint16 *)(pdata) + (n)) = (val) +#else /* L_LITTLE_ENDIAN */ +/*! 16 bit access - set value (0 ... 65535) */ +#define SET_DATA_TWO_BYTES(pdata, n, val) \ + *(l_uint16 *)((l_uintptr_t)((l_uint16 *)(pdata) + (n)) ^ 2) = (val) +#endif /* L_BIG_ENDIAN */ + + + /*--------------------------------------------------* + * 32 bit access * + *--------------------------------------------------*/ +/*! 32 bit access - get */ +#define GET_DATA_FOUR_BYTES(pdata, n) \ + (*((const l_uint32 *)(pdata) + (n))) + +/*! 32 bit access - set (0 ... 4294967295) */ +#define SET_DATA_FOUR_BYTES(pdata, n, val) \ + *((l_uint32 *)(pdata) + (n)) = (val) + + +#else + + /*=============================================================*/ + /* Slower: use function calls for all accessors */ + /*=============================================================*/ + +#define GET_DATA_BIT(pdata, n) l_getDataBit(pdata, n) +#define SET_DATA_BIT(pdata, n) l_setDataBit(pdata, n) +#define CLEAR_DATA_BIT(pdata, n) l_clearDataBit(pdata, n) +#define SET_DATA_BIT_VAL(pdata, n, val) l_setDataBitVal(pdata, n, val) + +#define GET_DATA_DIBIT(pdata, n) l_getDataDibit(pdata, n) +#define SET_DATA_DIBIT(pdata, n, val) l_setDataDibit(pdata, n, val) +#define CLEAR_DATA_DIBIT(pdata, n) l_clearDataDibit(pdata, n) + +#define GET_DATA_QBIT(pdata, n) l_getDataQbit(pdata, n) +#define SET_DATA_QBIT(pdata, n, val) l_setDataQbit(pdata, n, val) +#define CLEAR_DATA_QBIT(pdata, n) l_clearDataQbit(pdata, n) + +#define GET_DATA_BYTE(pdata, n) l_getDataByte(pdata, n) +#define SET_DATA_BYTE(pdata, n, val) l_setDataByte(pdata, n, val) + +#define GET_DATA_TWO_BYTES(pdata, n) l_getDataTwoBytes(pdata, n) +#define SET_DATA_TWO_BYTES(pdata, n, val) l_setDataTwoBytes(pdata, n, val) + +#define GET_DATA_FOUR_BYTES(pdata, n) l_getDataFourBytes(pdata, n) +#define SET_DATA_FOUR_BYTES(pdata, n, val) l_setDataFourBytes(pdata, n, val) + +#endif /* USE_INLINE_ACCESSORS */ + + +#endif /* LEPTONICA_ARRAY_ACCESS_H */ diff --git a/third_party/leptonica/uos/amd64/include/leptonica/bbuffer.h b/third_party/leptonica/uos/amd64/include/leptonica/bbuffer.h new file mode 100644 index 00000000..945cbb0f --- /dev/null +++ b/third_party/leptonica/uos/amd64/include/leptonica/bbuffer.h @@ -0,0 +1,60 @@ +/*====================================================================* + - Copyright (C) 2001 Leptonica. All rights reserved. + - + - Redistribution and use in source and binary forms, with or without + - modification, are permitted provided that the following conditions + - are met: + - 1. Redistributions of source code must retain the above copyright + - notice, this list of conditions and the following disclaimer. + - 2. Redistributions in binary form must reproduce the above + - copyright notice, this list of conditions and the following + - disclaimer in the documentation and/or other materials + - provided with the distribution. + - + - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ANY + - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *====================================================================*/ + +#ifndef LEPTONICA_BBUFFER_H +#define LEPTONICA_BBUFFER_H + +/*! + * \file bbuffer.h + * + *
+ * Expandable byte buffer for reading data in from memory and + * writing data out to other memory. + * + * This implements a queue of bytes, so data read in is put + * on the "back" of the queue (i.e., the end of the byte array) + * and data written out is taken from the "front" of the queue + * (i.e., from an index marker "nwritten" that is initially set at + * the beginning of the array.) As usual with expandable + * arrays, we keep the size of the allocated array and the + * number of bytes that have been read into the array. + * + * For implementation details, see bbuffer.c. + *+ */ + +/*! Expandable byte buffer for memory read/write operations */ +struct L_ByteBuffer +{ + l_int32 nalloc; /*!< size of allocated byte array */ + l_int32 n; /*!< number of bytes read into to the array */ + l_int32 nwritten; /*!< number of bytes written from the array */ + l_uint8 *array; /*!< byte array */ +}; +typedef struct L_ByteBuffer L_BBUFFER; + + +#endif /* LEPTONICA_BBUFFER_H */ diff --git a/third_party/leptonica/uos/amd64/include/leptonica/bilateral.h b/third_party/leptonica/uos/amd64/include/leptonica/bilateral.h new file mode 100644 index 00000000..e5b5bbdd --- /dev/null +++ b/third_party/leptonica/uos/amd64/include/leptonica/bilateral.h @@ -0,0 +1,136 @@ +/*====================================================================* + - Copyright (C) 2001 Leptonica. All rights reserved. + - + - Redistribution and use in source and binary forms, with or without + - modification, are permitted provided that the following conditions + - are met: + - 1. Redistributions of source code must retain the above copyright + - notice, this list of conditions and the following disclaimer. + - 2. Redistributions in binary form must reproduce the above + - copyright notice, this list of conditions and the following + - disclaimer in the documentation and/or other materials + - provided with the distribution. + - + - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ANY + - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *====================================================================*/ + +#ifndef LEPTONICA_BILATERAL_H +#define LEPTONICA_BILATERAL_H + +/*! + * \file bilateral.h + * + *
+ * Contains the following struct + * struct L_Bilateral + * + * + * For a tutorial introduction to bilateral filters, which apply a + * gaussian blur to smooth parts of the image while preserving edges, see + * http://people.csail.mit.edu/sparis/bf_course/slides/03_definition_bf.pdf + * + * We give an implementation of a bilateral filtering algorithm given in: + * "Real-Time O(1) Bilateral Filtering," by Yang, Tan and Ahuja, CVPR 2009 + * which is at: + * http://vision.ai.uiuc.edu/~qyang6/publications/cvpr-09-qingxiong-yang.pdf + * This is based on an earlier algorithm by Sylvain Paris and Frédo Durand: + * http://people.csail.mit.edu/sparis/publi/2006/eccv/ + * Paris_06_Fast_Approximation.pdf + * + * The kernel of the filter is a product of a spatial gaussian and a + * monotonically decreasing function of the difference in intensity + * between the source pixel and the neighboring pixel. The intensity + * part of the filter gives higher influence for pixels with intensities + * that are near to the source pixel, and the spatial part of the + * filter gives higher weight to pixels that are near the source pixel. + * This combination smooths in relatively uniform regions, while + * maintaining edges. + * + * The advantage of the appoach of Yang et al is that it is separable, + * so the computation time is linear in the gaussian filter size. + * Furthermore, it is possible to do much of the computation as a reduced + * scale, which gives a good approximation to the full resolution version + * but greatly speeds it up. + * + * The bilateral filtered value at x is: + * + * sum[y in N(x)]: spatial(|y - x|) * range(|I(x) - I(y)|) * I(y) + * I'(x) = -------------------------------------------------------------- + * sum[y in N(x)]: spatial(|y - x|) * range(|I(x) - I(y)|) + * + * where I() is the input image, I'() is the filtered image, N(x) is the + * set of pixels around x in the filter support, and spatial() and range() + * are gaussian functions: + * spatial(x) = exp(-x^2 / (2 * s_s^2)) + * range(x) = exp(-x^2 / (2 * s_r^2)) + * and s_s and s_r and the standard deviations of the two gaussians. + * + * Yang et al use a separable approximation to this, by defining a set + * of related but separable functions J(k,x), that we call Principal + * Bilateral Components (PBC): + * + * sum[y in N(x)]: spatial(|y - x|) * range(|k - I(y)|) * I(y) + * J(k,x) = ----------------------------------------------------------- + * sum[y in N(x)]: spatial(|y - x|) * range(|k - I(y)|) + * + * which are computed quickly for a set of n values k[p], p = 0 ... n-1. + * Then each output pixel is found using a linear interpolation: + * + * I'(x) = (1 - q) * J(k[p],x) + q * J(k[p+1],x) + * + * where J(k[p],x) and J(k[p+1],x) are PBC for which + * k[p] <= I(x) and k[p+1] >= I(x), and + * q = (I(x) - k[p]) / (k[p+1] - k[p]). + * + * We can also subsample I(x), create subsampled versions of J(k,x), + * which are then interpolated between for I'(x). + * + * We generate 'pixsc', by optionally downscaling the input image + * (using area mapping by the factor 'reduction'), and then adding + * a mirrored border to avoid boundary cases. This is then used + * to compute 'ncomps' PBCs. + * + * The 'spatial_stdev' is also downscaled by 'reduction'. The size + * of the 'spatial' array is 4 * (reduced 'spatial_stdev') + 1. + * The size of the 'range' array is 256. + *+ */ + + +/*------------------------------------------------------------------------* + * Bilateral filter * + *------------------------------------------------------------------------*/ + +/*! Bilateral filter */ +struct L_Bilateral +{ + struct Pix *pixs; /*!< clone of source pix */ + struct Pix *pixsc; /*!< downscaled pix with mirrored border */ + l_int32 reduction; /*!< 1, 2 or 4x for intermediates */ + l_float32 spatial_stdev; /*!< stdev of spatial gaussian */ + l_float32 range_stdev; /*!< stdev of range gaussian */ + l_float32 *spatial; /*!< 1D gaussian spatial kernel */ + l_float32 *range; /*!< one-sided gaussian range kernel */ + l_int32 minval; /*!< min value in 8 bpp pix */ + l_int32 maxval; /*!< max value in 8 bpp pix */ + l_int32 ncomps; /*!< number of intermediate results */ + l_int32 *nc; /*!< set of k values (size ncomps) */ + l_int32 *kindex; /*!< mapping from intensity to lower k */ + l_float32 *kfract; /*!< mapping from intensity to fract k */ + struct Pixa *pixac; /*!< intermediate result images (PBC) */ + l_uint32 ***lineset; /*!< lineptrs for pixac */ +}; +typedef struct L_Bilateral L_BILATERAL; + + +#endif /* LEPTONICA_BILATERAL_H */ diff --git a/third_party/leptonica/uos/amd64/include/leptonica/bmf.h b/third_party/leptonica/uos/amd64/include/leptonica/bmf.h new file mode 100644 index 00000000..328e2c0d --- /dev/null +++ b/third_party/leptonica/uos/amd64/include/leptonica/bmf.h @@ -0,0 +1,64 @@ +/*====================================================================* + - Copyright (C) 2001 Leptonica. All rights reserved. + - + - Redistribution and use in source and binary forms, with or without + - modification, are permitted provided that the following conditions + - are met: + - 1. Redistributions of source code must retain the above copyright + - notice, this list of conditions and the following disclaimer. + - 2. Redistributions in binary form must reproduce the above + - copyright notice, this list of conditions and the following + - disclaimer in the documentation and/or other materials + - provided with the distribution. + - + - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ANY + - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *====================================================================*/ + +#ifndef LEPTONICA_BMF_H +#define LEPTONICA_BMF_H + +/*! + * \file bmf.h + * + * Simple data structure to hold bitmap fonts and related data + */ + + /*! Constants for deciding when text block is divided into paragraphs */ +/*! Split Text */ +enum { + SPLIT_ON_LEADING_WHITE = 1, /*!< tab or space at beginning of line */ + SPLIT_ON_BLANK_LINE = 2, /*!< newline with optional white space */ + SPLIT_ON_BOTH = 3 /*!< leading white space or newline */ +}; + + +/*! Data structure to hold bitmap fonts and related data */ +struct L_Bmf +{ + struct Pixa *pixa; /*!< pixa of bitmaps for 93 characters */ + l_int32 size; /*!< font size (in points at 300 ppi) */ + char *directory; /*!< directory containing font bitmaps */ + l_int32 baseline1; /*!< baseline offset for ascii 33 - 57 */ + l_int32 baseline2; /*!< baseline offset for ascii 58 - 91 */ + l_int32 baseline3; /*!< baseline offset for ascii 93 - 126 */ + l_int32 lineheight; /*!< max height of line of chars */ + l_int32 kernwidth; /*!< pixel dist between char bitmaps */ + l_int32 spacewidth; /*!< pixel dist between word bitmaps */ + l_int32 vertlinesep; /*!< extra vertical space between text lines */ + l_int32 *fonttab; /*!< table mapping ascii --> font index */ + l_int32 *baselinetab; /*!< table mapping ascii --> baseline offset */ + l_int32 *widthtab; /*!< table mapping ascii --> char width */ +}; +typedef struct L_Bmf L_BMF; + +#endif /* LEPTONICA_BMF_H */ diff --git a/third_party/leptonica/uos/amd64/include/leptonica/bmfdata.h b/third_party/leptonica/uos/amd64/include/leptonica/bmfdata.h new file mode 100644 index 00000000..30e2b5ad --- /dev/null +++ b/third_party/leptonica/uos/amd64/include/leptonica/bmfdata.h @@ -0,0 +1,636 @@ +/*====================================================================* + - Copyright (C) 2001 Leptonica. All rights reserved. + - + - Redistribution and use in source and binary forms, with or without + - modification, are permitted provided that the following conditions + - are met: + - 1. Redistributions of source code must retain the above copyright + - notice, this list of conditions and the following disclaimer. + - 2. Redistributions in binary form must reproduce the above + - copyright notice, this list of conditions and the following + - disclaimer in the documentation and/or other materials + - provided with the distribution. + - + - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ANY + - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *====================================================================*/ + +/*! + * \file bmfdata.h + * + *
+ * This file contains data for constructing the bitmap fonts. + * + * The fontdata string holds all 9 sets of bitmap fonts in a base64 + * encoding of a pixacomp representation of the tiff compressed images. + * It was generated by prog/genfonts and pasted in. This allows + * the use of the bitmap fonts for image labelling without accessing + * stored versions of either the tiff images for each set, or the pixa + * of the 95 printable character images that was derived from the tiff image. + * + * In use, to get the bmf for a specific font size, from the encoded + * string in this file, call + * bmfCreate(NULL, fontsize); + *+ */ + +#ifndef LEPTONICA_BMFDATA_H +#define LEPTONICA_BMFDATA_H + +#define NUM_FONTS 9 +static const char *inputfonts[] = {"chars-4.tif", "chars-6.tif", + "chars-8.tif", "chars-10.tif", + "chars-12.tif", "chars-14.tif", + "chars-16.tif", "chars-18.tif", + "chars-20.tif"}; +static const char *outputfonts[] = {"chars-4.pa", "chars-6.pa", + "chars-8.pa", "chars-10.pa", + "chars-12.pa", "chars-14.pa", + "chars-16.pa", "chars-18.pa", + "chars-20.pa"}; +static const l_int32 baselines[NUM_FONTS][3] = {{11, 12, 12}, {18, 18, 18}, + {24, 24, 24}, {30, 30, 30}, + {36, 36, 36}, {42, 42, 42}, + {48, 48, 48}, {54, 54, 54}, + {60, 60, 60}}; + +static const char fontdata_4[] = + "SUkqACYFAAAmoHICP///////////////////////kFcchgc45Bgc45AgcgxBY5DY5DY5Agcg" + "jkM45A8GocgxBA8M45BfCGgchhzOQxZBiNe/CDQRT6RQ+k4QV6BHcgvBBjCC+KoSjQI7wjj/" + "16I+EUPTpV0rI4LilVtAjjyPuR58jg3CRd6dJkcDMCj+v//qlVsMgQPVY6vugih9Lr/8RCF+" + "OqUUK6C/fHFV9RStf8MulG10fKcN6X+lXOBg+GexX71wxSPCf4/+kE0uR5zE0rtfCFg3oIp0" + "R+GF5DSmQaMS/oG1xen0X2wyh8WXwoI46VPt/kNYcf9J4h/pUHB///2H+t+lkCByDj/r9ZBX" + "H1BAtUr7u/IEOQanrS0eByO16tpVaSWtaEVsNiG66WrBgg05wM4bCYNWDCWIiDCER6HGhERE" + "RER3ZHBfXjaSQ7iOP/////////////////////////////////////////////////////+Q" + "JgK95DIDRZAjCDccgRMhn4g5yC9CD0IL+QxhuIfCCYQTC4IJhBiyLBB7J4QX4gvQgxxBehBi" + "yGDkPhdkEw1kPZY5cEHck5BIJOQc9aI+wjE7DL7RdsMu2GXoZehGDYaDCDQaDSCDQdIOGEEX" + "bDLzCLthl5ojzkeL0NMJhNNbVoJ6kclXuggyOGfugnw3vugv/0u+9IN7pBvdJ//brT3VtdLy" + "B4NxyGsOPRnv9R7xx3/9L+EU/3/f4jj/t+3TdDvkFZyC7hYdKkCCKHQI76SW/pD/6XCKdAin" + "29L9L6/9eEUOrD0kv8IIMNKkq/j/zD5h+P4r//99LfBKcDR9utK62NLxEIIhnmGGlpek3Lz/" + "jj5cv/ul7f+EvimH///0l6CENpfrHt/y9l7kr/4RT/f7f+PwRTkG7/tpav26XtrxoVI5/vSx" + "xsP/7ful7fdd1tv/7FRoj//DLgQZgQCFhlYlfv1kx9//28mPx/7ruu3/t9K3pEh/IKzkF3DL" + "g2BENDtBr9Jh4S12H/+3+17GwwltpbZBx0u0unr0v9IMjhrBYYpO0KZmDikMJsYTCDCeE2Gh" + "p6DTdiEE2KCdo8GcNj3pJsJofjiIiIiIiIiI4iIiIiIhhCIiIiIiIr1SMwyQbOkEiGQCvd4i" + "I//////////////////////////////////////////////////////+QVo7IEDkGwchpOQV" + "nIa0ENKCGhyC7kHchocgZschnHIMPtKk7oIP7ulv6f9Yj5DIDaH/3gjjr///+rI4aiIEXngg" + "RZBfCBEWQXsofKggu5DD5Y+Qw5UHghiCoIEYQw5VkCMIO5TkF7shhzOQxZ4IJZxy3IO5nIJZ" + "4IP//1iiPOGd0R+iPQgR3TQIIXZ3/S7BBnezui87MOiPbKHRHqftNNXvTTUjy/9JkcFjTpOk" + "9NsKmFTu+Etppw06VtMjhhO0OLCd3S+rSdIUvyDD+Iha8fQ//+K//3/+D/vbQRT7d9LsjhgI" + "7nH8Ivf/lw0bS/4RT////7f//pfq+lhr6/v/Yf/t//3/+D/sO2NNhpfiP66Xat8L/2//3S0r" + "XIMD/rvUEd9Isf/4Mp5wCDgYBlOzgO0fB3aem2mmnYTtipwCAZQ6DnAXDgynapwk20h/+IiI" + "iIy9ERxEREREZHDLiIiIiIjjj6kNWdP//qP/pMjhq8bSXwojsGkEwmliIiP/////////////" + "/////////////////////////wAQAQ4AAAEDAAEAAACSAwAAAQEDAAEAAAA2AgAAAgEDAAEA" + "AAABAAAAAwEDAAEAAAAEAAAABgEDAAEAAAABAAAAEQEEAAEAAAAIAAAAEgEDAAEAAAABAAAA" + "FQEDAAEAAAABAAAAFgEDAAEAAAA2AgAAFwEEAAEAAAAeBQAAGgEFAAEAAADUBQAAGwEFAAEA" + "AADcBQAAHAEDAAEAAAABAAAAKAEDAAEAAAACAAAAAAAAAAAAwBIAAAQAAADAEgAABAA="; + +static const char fontdata_6[] = + "SUkqAMoGAAAmoHVf///////////////////////////////IZAUfsgeBdyGdyDjkMgI+QPKC" + "GIO5AhzOgyGiCMcgYtUrIKHohowhschs4hnwgXcgRQhsgguQQXwhov6/QYQI7qgRUUk2QIfV" + "F5hQmmugqCMTCBHj/9F8j9JuknWm7rSbCBFPLtou2sjhlBSOKkE3Qf3+kv9fpcMQaXY9PTwR" + "T6WvpX/0v19aVbeQ0D6X7+v/X//QIQfj6xSS4QLS3xx69IVtL/EQy8CvbSqhq4I7//pJeVnT" + "Dr/+Niloufj9fpJLxalYrDtdr2DGk/etf6CDrkduzQkw21/w2prRfYZcNbj1+kQMQuL03hF5" + "sQRT+CEMMj7pAjuk/5DVDINfr+k9b06Stj+GXgW6pN9/kNsdL/XQg/+nSx/0v20vxSv0v/S3" + "/yDA/19sV/6WkQ0D5DY/6+lkDyf/SX9h65BRBDTdJ/StLILuk2lWkl399U2kw0Thpa0r7S0U" + "A7S20rSVtJL/iGrFMSPJv+qYoEaA+KBA4pikmKCWIiDVCINaQ0KiIiIiIoFhoRfSodbS1xbp" + "Id0hx8f///////////////////////////////////////////////////IHMFnMgTA0hyGQ" + "G45DLcg0jkQfyGQDNxBv5DLcg3QQ2EEHDIEaEHDIaDkMTJzIeZBJkEmTwh5kNmEPhB7ITCGi" + "ZDOghsmQ0IIbJhHUEMzPAh8jYOeIuRsEZFHCZEHBDhdoww1DLm0bOGXGwZccGXHCMDgwQMED" + "BAwQMEi4ZwQdAg2GEEbYYZc2EbYYZcwwjB5dmDgwQMIMJoNbQNqHuRxF6I7YQIN+6BBrDf+E" + "E//pf3oEG9tAg3vC9//126bQWlXh0gyODd+l7fXwv/0u1gio0m90m916x9uu60nXXyB4G7kN" + "tx6JwU9oEU/4944qP/pcEU8EU+37f7f4j/q6q2tpDXhYaShBBDer1XfJD5IdL/0vtf9L9L//" + "ergin9JukvIHk5BiAggw+kn1fSr///9L3r2/fS30of9r1exWqXp4QQYaWl9XH/a2vH+l9/t/" + "6X58mgN//r07dJe04QRDYGGGgvpVeXb/jj5gT8X7r7f+CX6CDD/bp6bXY/xEIIQw16Xq8N/y" + "5ZcvT/Lp/de3/j+2QMd/r/p0l6CDdf0h73//ZF7/w37r99/fuD/vVq9SP3S9hpd+lLj/6444" + "a/9v7r39L0tt/7Xq9b0vDDIbAwQQu2ElKHq/fr3f/2/dfb39/b/V6jjSb1Io/hhiEFbEECFK" + "r/euRR+//28ivxXt913XZBcf/jaevr8geTkCHDDCCIF3bEk9XpN6X7f/7f7+xtpbaW+l2l9K" + "3pfpqGGEErBhJfCTBk4wl+wf/7f9fsMJba7cMJbDSa9JvSX2sPCwxCQYQaFBikIQQwQMMYIG" + "CBggeCBsNCgg3CBhBuGKBA2KBA24hAgbFdOlYIGh+NCIiIiIiIiI4iIiIhxEGCERERERER9L" + "GHfVBF0Tgtg0dSBoDTYk+h40PiP/////////////////////////////////////////////" + "//////5A887IHkOQbLIE8EFaCGvBBmsgosgaDcg3HIbHwaIbIvVVIZTkGHVUtv9IOHRHBU+D" + "g5DJBx//QRTr69fr/+3X+I+v/pa//v/9N0Q2XnshsshsjIaMyGjMhlOQIHycZAhyDUOQy+IZ" + "xzWQUWUOQYc7kGMyGdyTkH41kH4scnZB4JwQxhrIYp/64hF56DCLzBF4aLzQNF8+DyuCguuF" + "Kw/ApXIvMFTCI7FhU0XmgYUL/ap0tow3/6TdN2XCTpB0rVJqJHmHD6BYbNhoDEjzSbDDLhJo" + "NnHSdQ4cMJoMJQ0DpBphVC//x9v/ScMEkwqf9Lpp6dJum18cQwX3V9XXWv/pN9OkKX/9f6X1" + "1/TpdX+6umrDdRSS2yBGFv4iQZu/9D//4r//f/58CP3XI/p7pL9F9peEYv/zAF8NL/hFP///" + "/t/utrrutN6SQYr0F//7Ff+3////g3/11dJ+l+I/+ld7ey4KP+3//fpX5DOOD/3sb8j+6X/9" + "en1+v/b//dLr//Vuo0rY0ib//aphKGYdtAinbLfROC//Yf/8NKGEmwvaUOwvtK3SX/7DPcUG" + "NjhsUEHhBwwg8JuEGEGEHDCDhhiopiCKcIOKeJHTd8JNuh/+IiIiIsubERxEREREZcNKIiIi" + "IiNDj+En/X/IbQdf/+Cj/9Npd6SXq3WLDSrwSEdigkEGCDrEREf/////////////////////" + "///////4AIAIAA4AAAEDAAEAAABBBAAAAQEDAAEAAAA6AgAAAgEDAAEAAAABAAAAAwEDAAEA" + "AAAEAAAABgEDAAEAAAABAAAAEQEEAAEAAAAIAAAAEgEDAAEAAAABAAAAFQEDAAEAAAABAAAA" + "FgEDAAEAAAA6AgAAFwEEAAEAAADBBgAAGgEFAAEAAAB4BwAAGwEFAAEAAACABwAAHAEDAAEA" + "AAABAAAAKAEDAAEAAAACAAAAAAAAAAAAwBIAAAQAAADAEgAABAA="; + +static const char fontdata_8[] = + "SUkqALIIAAAmoHcGf/////////////////////////////////kMgMsfUgeDaOQLjkHHIZAN" + "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" + "jAbFVthw+gsG4qwbbSsGKDYQQcMSPJRSBwd6dPbSfpL/6f6tdXqx1YVf6XTCevem168GYDR9" + "fSutLS/9WxeuqrV/9/wl/7pXXXQ/91p7pXjSW5DRhFH+sLuor///6C//33X4P91bl1pjdJKt" + "hovBr4iQPKn/x/X/F////7NAz/v0tavW9aYaXhG3/+YDM2l/zCf///+3+9e3TvSTeglDFegv" + "//bS/9v//+vw3/q3Wt6pf0PpfV3+xX/t//3635DNv9utb0R9t1X4/+vreyOGZ/2//+uvyGx3" + "/16elvVIjH//Xp3/X/2//3X3//WKjjSeNb/+10rtWyMfX/2//7q0rX6u1d2kraSr/3RdYaTD" + "LdsIv2GvJAZ/+w//2GErCCbCLr2EoNiR161b0l/9g0HI6FBimKg2KCB2CBwwQPBA2wQMEDBA" + "4MEDhhiFFBisETgwITTCg2vCTDaQ//ERERERZg2IjiIiIiIzAa8REREREccfwgg/9f6X+v+Q" + "ZK///0x/+m0sF0q9W0sW6XyGSGkOkI7YSr4rYhAkEGCDrFhCI4//////////////////////" + "///////////8AEAEDgAAAQMAAQAAAP8EAAABAQMAAQAAAFUCAAACAQMAAQAAAAEAAAADAQMA" + "AQAAAAQAAAAGAQMAAQAAAAEAAAARAQQAAQAAAAgAAAASAQMAAQAAAAEAAAAVAQMAAQAAAAEA" + "AAAWAQMAAQAAAFUCAAAXAQQAAQAAAKoIAAAaAQUAAQAAAGAJAAAbAQUAAQAAAGgJAAAcAQMA" + "AQAAAAEAAAAoAQMAAQAAAAIAAAAAAAAAAADAEgAABAAAAMASAAAEAA=="; + +static const char fontdata_10[] = + "SUkqAGwKAAAmoFQGz///////////////////////////5DIBocgZg0PkDwy3JvkFdyB4Qchl" + "DkGB7yB5OnZBQ5J8hmckQ0rBNUyDSOkQWnIZXkMqZBrghs0INDkM/kdkDfsLqqhGYKDEHp0k" + "G0HkFEwoQaaqCcWQzzCMMPXfwg0m0gi89KyCgekkYmCpppYQKgjc0m//0Yy8/16VtP0EGwqN" + "to22ugtBBtJv2vpLdJtJJ1SbTpJKwjnoOgg2swGmFLgiStb3+lXf/69v1bYLpuuR1pLVX//X" + "r/S60mwYorKXH/dfS69J/2vX/9UvYyGU699PXXpa/3//4+l1S2EcXqvXHX1qr/8RIMCP17SS" + "pwggnqvj1XpClpf1+3SWlS2l/v6S+btbr/IKbknv62KH2Fel/VJeEGlTDS/1W9tJKiGL8f/1" + "Sri83qxVr/sQ2K1JBpXel/RAuOFXm29On//YMUk/dhf+qEOuEHQtWG2v+w9GEwZuXj1/Uuw1" + "6bnzaSDtF1/wbSI+Sdx/X9IQ6WPCb0YbYr38MvvCMTVv8gqlyGsR/pX/ukkHaS8gqiMOkk2l" + "f/pfpOlvXSTYa/9/b2/yBO9f9cTQMzuu4/RBSgnHpJe2l+KX6Wv6ST1j//7f/2lpdf/pfkM8" + "el+xVr0/pEMofIZV16+v//9tda/pdZAh1vS+sge4/0kv3fyGbBBVeutK126dLtJLuq+ttJuH" + "+FTV/SOR19dJPSWqr6SX2gyx+ur7S0LbS20n/oJf8PS20mwjeNtf0noINYMJBBwwk2kk2kEF" + "texFJBiExCYXXTWwwkCBrEIEDimGEErDCQILERBgsQwgafFRSDEIRDCEMIMUIYhQWQyAaHER" + "bSrERER/0q90tfukqxbWh3odtLbSxH//////////////////////////////////////////" + "////yBTDMpkFsFhyB4YOQyAboILYFByB4hyB4vkMgCIK4iOQsFWQ07IZxyBEeQyQ1PINNLIZ" + "icEDIMeWcgoBkFy4IGQIIIoZByCDhkHIInkMEEDFCGyhBJkFzggyDcYCDINxgQMgwoIIGRDk" + "EIIp0O0MhjrIPyZDCj0GCD4aOEHEN3CPDDaDTQaapp6bwjxByc2EeIOTmGEcbw1TTT7ppJ1U" + "4B46aPGGmQabJeECIJZDPZEmDNhIM2JQIHBggwQMEDBAwSBAwQNo4DdkCHQIGyCiw2gQNkFF" + "htBB5cZwWGCIMOGCBhBglBggdBA6U2Ca5c2EbDvwbSayCZh8Ogg+/6C329JvbSb3SD777/q3" + "TdQq9INoIN/oL2/9J//S7W9IN9pBvv//tJ720m0tL/SbT3X2/9L/9L+XXSvdK90v//1p0nrS" + "+npuXX0vb66X/9Ll0176b/b///eu++1/yGQxyBwOOk63+++ONV/6X8uu3r+l/iOP2t6uk9Cl" + "4WHqR8e7r6SH/Uf/S+19v3/f/96dGF7q0kvCw0qCBAn6vpff//pe9e39/3pX/a9XTaTql5A9" + "wQ2QEmHWgmKer6X8iPkR1/9L7X30vSS///991bpL1TCCDBpKv76Vb/9f+l719+/W+lD/erXW" + "K0v7wggw0qS9K4YIL////QX3+3/pfpMoBq/a9XTTapfWCCIFy4MNL694g/44+P9fdL2/8Jfn" + "mzoGZ96dX+6S92ggsMNLS9bmyD///i/v9v/P/6BMP+/r22KS8RCBCGGl+teDf84POD82DH79" + "1//5HDL+Gw3+6/a/XhBBhpddK+/9PT//N7/r2/8b9yGpT/q1ek2l9BBuvS6vu9f+yDuRj/+3" + "9r7ff/2D/2r16MLpfT9+kh7/X/xf/t+9e39fW2/71q2qV6XsML+qV//jjkCM/9h/a+36+u2/" + "/9dU3peGDCCbdtalw/2/93/9v3r/f2/b/20r71frwwyGWXBBVbaL8JK/+l9//t/a+33X1//7" + "G+levhh4QIXYqKNFX7fWQR9v/9vIO+9e3uu2ltkND/rHUaTekQw/hhiEE2IpK+l6///7elx+" + "33X+313TXX6X5A9uQUQGGEEQa4tKr9vS/b//b/a9jbS20tvX16dJvS/TChgwgk2Gkr6TDILj" + "4S/Yf/7f/+2ltpfdbaX6Tfr90GwgtsJd4JNhcEtLb//b/r3YaWw0tu0uDBJp9fSX/B4WGeNB" + "NNCEGZkghCCGEGGZlCDCDCDwg2GhhN0GE3YYJBBsMEEEGw4YJBBsV00kw0Gh+1QeE0xCCDBB" + "hBMQkCChBsQggwQYQeEG2FBA8IGCBuGIQQYYoINuIQINr8JWCBr4qIiDCERBhCIgygDw1IiI" + "tCLhghBghEGEIMJrxER+hEaERDiIiPpaB/0g/SIGwCcdJFzOgGgr6jEGvGgamgH2EL4j////" + "//////////////////////////////////////////+QP6EDob+QPBoHIElkDw9kCyyBJBA8" + "F7INVkDYDEZDLjyGVCZBXmCqQZPIaUENEAoKlt5A8sTSfV00/S2/6BwdF3D+Dg//pr6Q/+QW" + "wbj//MKvrtNeC/9JN1/iP//+vr//+k3////9r///+k9ZeECzPy+IZY5BuP5AuOXhHhDKHL4g" + "tOXxBowscg3HLjIGByHHIG9CMci+Qzv/+3BEMyeEGQMUCGQLzyBimgwUgRmRewVNBgqDIZXg" + "qYQsFTIEUyGzAUgucuippgmRLIOcuhDFX/pYhPTChGHCNzROBBuKAXpgoLoLBU0wVMIwwwVN" + "Fzgqow2icEgoYIGCDBYMK0EGEDClxP/7YRtvl20YOgg6CDYVBNaMXfQXovNGK6MUIJt0XbCT" + "WqCDhX336B6apJL/0ug3bpB0nSsGbDZZsNghBsHB9BYNhiE2GIQbSbBsNoJwYkergzYN4P1p" + "9pXXX/q3vTaWrr6V1/pf9at02vTX/t7fTaT+l/9Y/rr0370/6XTT0/fr44/6WnuukKpdkFFk" + "K/pN+9DWv//6C//S/rq/7+XVJum9Kt0DXxEF9V///9f/991+ZgY+6Tf8VrQSww0YwaXkDwOE" + "f/H3X/H////sH/+k2k1dJN6SQYrwjj//Ng1dL/m0////9h/t1/tvpN6SQa9Av//ev/b////w" + "3/rpN6ekrelQ+v//sMJf+3///X4N/3t+lt6X4+l6V33hiF/7f/9+t+D/ulr6L70q////+XBp" + "/7f//XX5BQO/9/TdJNvpER//16d1fS/9v/919//1emONK71r//0rtb1/9h//3Wla/XrHWrxS" + "S//YRdbpsijtourZFfT/9v/9+0E2vrZ3hourW0k26X/7aWgwgmGFYaVsMJJzWBDtPTYaaYTt" + "O20oaTYRhUGnUUxV76V0kF/9ioOXQpigxUNiggbYQOGEDwg3CBggwg4MIHDYaCimIWEHDCCa" + "ah9OrDeP/2ENBoNMIQwhbERxkcMgYqbQTCxDEJpoX8RocfxEREUYE4jiOIiIj/2En/r/IG5d" + "J/1/////H69JtLIH9NJf3S6uq9ISh0CxdL8gt46iO2kl6FbYSCQIMIHWGISCTCbWIiI/////" + "/////////////////////////wAQAQ4AAAEDAAEAAACoBQAAAQEDAAEAAABCAgAAAgEDAAEA" + "AAABAAAAAwEDAAEAAAAEAAAABgEDAAEAAAABAAAAEQEEAAEAAAAIAAAAEgEDAAEAAAABAAAA" + "FQEDAAEAAAABAAAAFgEDAAEAAABCAgAAFwEEAAEAAABkCgAAGgEFAAEAAAAaCwAAGwEFAAEA" + "AAAiCwAAHAEDAAEAAAABAAAAKAEDAAEAAAACAAAAAAAAAAAAwBIAAAQAAADAEgAABAA="; + +static const char fontdata_12[] = + "SUkqAFAMAAAmoFsNP/////////////////////////////////kMgNpyBoLGQPBocjfIEkED" + "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" + "8RIHgYPv/DC//+v//7/ygDH/dbprVIJYbRuBhLwRmv/x9pf8X//v/7B/6V17vShh4QVBj8I8" + "f/4L6/5tP////Yf7fq2vfTeqQa9Av/5wNS2l/7f///+G/9J66vVK9KgYXpf/+w0v/b///r8G" + "/2+9+26Sf8fX6u/2K/9v/+/W/Iav/6WlaSL71S/H69f7wwv/b//66/D///pb0v//16vouGp/" + "2//3X/yGU7+rdOrGrd9EKP/+vttr6/+3//daTf/36xVJNukkv/66Xe3pf+3///Wv16sfpXGl" + "//aLraTbYRhYZCPp/+3/+2laTYX1u0XWmnV9L/+wl3CbIjsMJbDCXIwG//Yf/7aVoKGEbXus" + "zthLfqm2kl/9iFMwXBhJhhJiFMwzjIMEWQYRBkMEZBghhkEIIYIMRMwwDg2GlDCTELIMaQwS" + "ioqZgY7glB6H/7XL4pimlYVtp3fbV3dp2xCimF6EJ2uq92v/2hoMIMINCGEIbERxDBCIiIhh" + "TeEGsQwmgwhd6EccfsREREIwE4jiOIiIjX+Egf//1f9f8gVq6/6////S1H0vSb8gfo0v90vu" + "v0m4WLrXkFsGsdRHtJL7S2GCCr4rDFEDwUYQyQ0yCCqGlhgqXaxERH//////////////////" + "/////////////////////4AIAIAOAAABAwABAAAAYwYAAAEBAwABAAAAeAIAAAIBAwABAAAA" + "AQAAAAMBAwABAAAABAAAAAYBAwABAAAAAQAAABEBBAABAAAACAAAABIBAwABAAAAAQAAABUB" + "AwABAAAAAQAAABYBAwABAAAAeAIAABcBBAABAAAASAwAABoBBQABAAAA/gwAABsBBQABAAAA" + "Bg0AABwBAwABAAAAAQAAACgBAwABAAAAAgAAAAAAAAAAAMASAAAEAAAAwBIAAAQA"; + +static const char fontdata_14[] = + "SUkqAKINAAAmoCAz/////////////////////////yGQBw/kMgGYcgw5DJBpvIHg1wR3kCuC" + "B4NFhbrIHiwnZAxZFjIafUQ2+BJJshrRkGnyGtBBqmQ05kNqyBcQQ1YINyZBRMhpfhf1CMwz" + "S5hqg9W4aggwoIGCDCWC4QYIPXrwR1BQm6Wkm6pGzYKmn2EFQRsgwjhB/9UjeXg0m1RifVkM" + "t1VBNhUGE1pAtBBtBN//hBYdboJOkk2nVJNgj3R4s8b8JUk6TftfpYfdafV09VbQXCDcEHWX" + "BWCmAIraTf/9eldL0ld1VcLp6bRddKkqff91Vf9fXbDeqtwum0v9L11v/+v+uqSwxR+rx/3S" + "9LS+vfqtf9da7DHr+/pel/79f1/9dKr5Boha9Lr/9L1/a/8fXSqsI/ev/HS9Kkrrv/IZ0n9V" + "aSXYIEU467ePX6j2v+I/tqulSulfX+qX0ldf/e9U6Q9wr1X6pfJ+u2l/kFqyO/tJYr2vr/qv" + "BA9JhpX/XeG0qqtq9f1SS9NIl3DS1/pg8MQlyJWuP/9JfF4QaTFN//EMaVd36/SIZrhNLnCe" + "EGob1/2U4bUJ/cLX/iDXQQb06Ydr0uw6RvZCaePX6V106EwdK2GF38NqQnJOzgE/1/SkcbS2" + "nhBtQjc2JfX6kGrSgjDDW3/r+hDfi3CekEG2v62XmoQTdN/kDgCIKtS/pOl+2qQba/IHCTD0" + "rat//X6Ta/XSuGEl/htaur/0v9et91SbH/+l1evIH0a/pOhJAaf0t/ogtWRY3Wm9v/GutLX/" + "S0sdfpfbS/X9L/0t/r9L9v/pv63r19L8gXH//tL9ddKiDVn9fX19JfbFPXXWkQan+npekv//" + "99df0tLIbHW+vXIHjj11S6bf8hrWQJHp/Sb/rVfS01/rddu/BUH2lpaW2k9JNpJa63pJX3D6" + "6TX9IoZddrf+gvrvS3psIMk7/9N1odpbpOkraQS/70km0mGEcxWvWrpJqwwknDCCbSStJL+o" + "PCW2EmKDXWtUwwkQy06xCINQyKYaWGGEECC2vDEQkgxBMINN/TSsV9bCYhJMUCBYiJBppiGC" + "DC0hxoMIRBghYIMIQwULIZAHDiIvpKIiIj91X7qtfdUvuklXtrS4t0o+lC20h263SxH/////" + "////////////////////////////////////yBlyPyBmCy5A8NUMhkrQgaA6CB4NKCB4ZhyG" + "QBxZCDkHcg8EUcg3cgr35BbB5kGw6kNRQQ1QZAgwQaBogwBkGgGQ0VkPWQxWQxWQxWQShBes" + "g0oINBBDCCDcMhmJyGWrIaichmKwQMhoEyD1kEDIPUQQiPjIMTIaOIL0IKMIEDc8B4WCBggd" + "sMIMMgYZkOCDDQYQaDCDShoNwg7QQMMGEDYYQeGE0GEGg0mGk1uutMIPBnthGYRAzwIGQaMO" + "nIKMPWEZhiQL8DBEMrgYIhldOBlngbcEDZDKgIzEYM8EYRmIyGbhCURwJwZ4C5gFAIGEGCwY" + "QNoEHSr7CMxA03ISYQIgxjkGJ5BiMgvCBB6apqkqtK9AgYbg2gQMPBsIINTAU8FT70/T0G1m" + "A2L5gbRwF34dBB8N/4QT/+gv70E3toJveuv/XT20m6pfSDhBBhp7aT4b/pBV/6Xa3oIN7oIN" + "7aT/+3X7aTpaX02k/ul7f+k//pf+k/aT+v1/+qT1daX/TaML6Xt/6X/6XMJowswnre63vX/7" + "ave2rpaXi6Tffpff///hL/9vSb9Jv1//6/0m168hkA3H0np/r3xxS//S9tL2/f9/xHH/tGF2" + "6ehXwpA/foh7bW/Ue/Uf/S//b0r9K//20vtK0rSS8LDpIEzZ19Vv9f+l9pf+/7//+9e6vpeF" + "hrhHmR/at6r/r/6Xv+3r9L9X+2lq3t1aSXkDyggYgJMHSSCjf+vvIO+Qd//0v0vb6/q9f/79" + "LSbSr00wggw10mtJ9Kt/+v/QXt/t/ev6V//pPtpevqmEEGGlr/eEl//X/0v0vb1fpX6Yf7aT" + "98baSX3ggQYaSSXpPhAv///9L2/2/9L8JSQCr/+vadJL/CCDDS6r7j//+P9L9L//S/CTNYa/" + "3S1dJq+vpoIIg0AQYaWv1yXDZ+OP/0/b/b/wl+ZDIgNP999+6S+00EFhh116vOCB///xf6Xt" + "/5Z/4Jh//pe3el4iEFhhpaql3g3//OAX/ft/t/8L9wb/bSferYpLwghBg0F9aT7f84D5wH//" + "Ob/S9v/H9shr1f/1arpeEEGGvX97f1///t+3///7kFU/7pWr6MJtV4QINpeqST7////7f6Xt" + "9/f2Df9//7r8IPX1xfd6/9kNGn/t+3+39fW2//ulaSTel9+36Xu//7//t/17e/v7b/tpe+k3" + "pfDBf1pf+scchld/7ftr7fr2u7//1ev14MMIJvdUpgGH96/b/+3//919d/71a9U3peGGEE7d" + "yOqSX79e//7ftpe3v/7f/avuqV6+GDINYEEEO2EnCW39/9//t//t91t1t/09aV6vpeGHhArY" + "qKLtL6fSyGd9//28hoftL2/X12yDd69bX/Sb0iGx/DDwQTYaYSW3rel/f/7f7/t7dbdf/f8b" + "1V9fhhiEE2IpL9N6/t//hv+K9vbXtdv/V6qNX0vyB5QQy7DDCCINsWtPq3pft//sPXf/tLet" + "vS26jd0r1/TBIGGEEm2l3pN6X7f/7f9extpbaW3a9r1Svpfrhgwgk20l9JhkNj4S12H/+3+/" + "u2lsNL+uwk19N6S/dBhhBbDCVN4JMMJYIL9h//t6XXuw0ttLbhhLYYS/Svpf8PBYYMIJO0KY" + "MFQhIUmwYVNNPTbQ03TTdhhBJsMJJtwwkmxVNOraaH9JB4TTFEFAZDGqCDEIIIg0AZBisMUQ" + "z1kPWQxXkNlbBhSC+mQlRDGmGKIZVYZQwiGVWwcQiDTW0/QJQZDKrX2sPCaBgvRTg2BIhA0u" + "GS4KP+/te4YLDEL2Fhr+n/xoREGCERIKgYiJBVDERxERxEODBCDBCIMEIMF04iI+oiNCIkDw" + "1bEREfrCB/WEH60gf0qMMH6VIIGU4GoKfSIEsGKCDV9UQNA9IeNA1JAHnhD4j///////////" + "//////////////////////////////+QPkEDMFW+yGQBPBA8NSAmQZ4IHhqQQ2oIEoDFkGuC" + "GlHkDwN4ILMyB4NM1ILMyB4NMyGrNLYeQPF4g14kFC4UgqQQLwFCpbe9pEGbiB4NfIu5As5N" + "Mg34hr9X+qu6Qd1t3Xb+0vUf//9G1/S+vIGYZj//tr67TXhf/S6/xH1//bX///9L/X///bX/" + "//9Lr///9Jtf/////8l/kNTiHwg2f/+k3LhpGgZclMhqeQaJ5Bp/INU9BkGiCBeMgnZDLgIM" + "IMhmwgyDXMg1QSmQ1KE3IF4JYQUHyGbBBdyBGhJBDXchrcQfCC4ZGggwE//xCDwgwQMIYIPJ" + "OCD0wUF1yCj00wVMEDBUGEMFCgg8gY8h+8hjRSEQE1//9JsJ6YUKEcMMIYRsjqBFMhsOC6BY" + "KmmQ0HTRsgwUINSDB1RgcI6BiCgz4OCBnwSDBBtAgz4OCmARf/thGxvTCOFCODoINhJJrRg3" + "+gvRt0YN6MGwgg3phGxVqkGgvvvbh6dqkv/S6D6MDaCDoIHS9J9BByBjCDfNLIGJhtJyBfEE" + "HSbIKMRgVoIHIKMVJ1IaMIJnTrTaTpaX/7e8Qm0mknSbIN8VnAMCn/S6YpuKem4hB0uJdpcg" + "oz3+9tb//9Lq6DpaTr9XV/hBdV1avTaXQff+61S66pL/9t3r/6b1en/S6aenW/Xof/dW/bSd" + "dL8gpD+lj7aTrr//+l//T02vVj/1ownTaV0KSW2QzMv6b/xr///0F//39ff9r1r060luEDXx" + "ELuq///+l/+vv/B/vTa3TFeqWw0DS8hkBoI/+Gv1/xf/+/r7JAZn7+n2m6Sr0bMMJeQyAXmb" + "P/j7X/v////Z1Av90v19UmHhBJBj8I8P/8iAMXr/nE////9h/3tpN03dJN/QYXoL/+cBs2l/" + "7f///+G/3S/W3XfSSBr0vr/2GEv/b///r8H//W6+kr9ofS//9iF/7f///+Q16f39Poum3pfj" + "6X93+GC/9v/+61vwf90m10lb1S//9L+9mA1v+3///X7/39N6T3SX//07r6X/t//v+/kMt3/d" + "LX0rdVId//11u9vS/9v/+0tK//19jikm+q//16bbX1/9v/9/rX69YqnVtvS//tdL0XWyDj6/" + "+3//aVpNr39our/XFJf/6L+GgmGQo7aW2vf/t//t1DSsIwvpWW8NL6pJt0l/9sJcMJMMKwwl" + "sMLyXAv/2H/+2lDCCYaX2lFMVbTurdKl/7EKDiExTFScNAogRrDIMazQMHUGJAjVsg+pDGpt" + "JOCHUQ0DQGEopiFkCKoYSdqThlfBKD0P/60Y07WGFt/+wuv9iFCDXxCaa3pqnf/8MIWgYQME" + "DCEMEIcRHFghEREQwU5BBhYhhNBhDT4jQ4/iIiIhGw7xHEcRERH/0g/9f4Sf//yB+Bf+l/6X" + "/9f/+ra+PVfXWCf/q2uC6r9NoLpuq9RHHS/IGeOltpV9rtpJehWwwSIHg08EDCDrDEKECDIM" + "tVYYIfaxER/////////////////////////////+ACACAA4AAAEDAAEAAAATBwAAAQEDAAEA" + "AABKAgAAAgEDAAEAAAABAAAAAwEDAAEAAAAEAAAABgEDAAEAAAABAAAAEQEEAAEAAAAIAAAA" + "EgEDAAEAAAABAAAAFQEDAAEAAAABAAAAFgEDAAEAAABKAgAAFwEEAAEAAACZDQAAGgEFAAEA" + "AABQDgAAGwEFAAEAAABYDgAAHAEDAAEAAAABAAAAKAEDAAEAAAACAAAAAAAAAAAAwBIAAAQA" + "AADAEgAABAA="; + +static const char fontdata_16[] = + "SUkqAHAPAAAmoCQP/////////////////////////////////IZJx0QyQzjkM45DJA3vIHhr" + "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" + "/0/f+/8JfmIYP96un23SS9poILDDS6rSeeCB///xf6Xt/5ZH8Ew/73XXvS8RCCwYaX6XeDf/" + "88GX+H7f7f+wX7hh/69XVsVXgghDDrX0vb/ngfPA//57f6+3/j+2Q2hH717+6+EEGGl0l77f" + "++//7ft17f/+2QV9f7W19PS8IEGHX6S3v9b7//t/r//9bkFNH709NqjabSXwg2v/T93///+3" + "7de33Xf2G/7/6S9L4Qer1SQvf1/7IN6v/b/X2//9sP+66V9N9fa79V+/X+9/+37de3v7+2//" + "Xvrevwwv6pX/+OOQzJ/+3+vt+l6W//e2ukk+l4YMIJ7fVGwz/vX7D/+37df9/f2/7pdXpN6X" + "hhhArfRdUqf36///b/X29//b/7/f768MMhqiYIJrbS0Et/f+//7ft17fpb1t/7paWqT6+GHh" + "BC22lpU/vpff/7f6+339r/6X33SV6RBRHhh4QVsUxCJ2t9XrkG77f/7eQUPt17e9b1tkC8V/" + "exv76VeDB4QThhMJa9W+v//9vX/77S7S2/73Sr0m9L8MMQgmxGlf70tdv/9v+K99v39vS3X9" + "ikr6/IHhYINEBhhBEFS7S70m9L9v/9v9/b3S20v/umKrV9fwmChhggSbaVP03hLrv/9v+vY7" + "S7S29L136b0v7UMMILYYSW9WGQLvpft//sPS3/bS20tu67S90r0l/oMMIJNtL8JMMJYS1ww/" + "/2//3YaW2lt2lthWqpX0v1w2gsMMElbwSYMElIOfW2Gt3fbarbXuGwgrYaCu7CVsGEv0r6C+" + "6QPC2DCSpoQgxoQkNWDCqq6txrppuwYSUMMElbgwknFe6tpof1h4TQYhEDGpBisIIMIIIg1C" + "hBgQGIRDQIIIIIYEZBuIDBhSC9TRDjCD1OxCIZohiEQzRDBxCINYwNNNUCTBkMsQvtUHhNBh" + "eiXBVClWGrwZCAX/7r/4YWGFuGFhhf1/44iIMEIiDOoZIaDUGQEQiIuIhwYISCmGIgwQhgvx" + "ER9IRHERIHgrwIiI11hGgGwCzroO+qCB+loP9JGCNQGwGXpECYGYPSCBkuBsBt9Q0qBr0ooS" + "GciHjQMJHQDx6IGobv8IRx///////////////////////////////////////yB49PIZIsED" + "wZIIHgxxA8rIHgqWQVrIEsM2yGnZDUvyGQoIM8yB4KnhSB/MgeDZMhtTCWw8geCTIamBIFIH" + "g2IUgzEEFeCGXAKC1t7rXrpp+v9WpA+4geCryMHIHvk0yBfiCp1b7ql6Q/+vf2vr///o4tel" + "015AzBmj/6tf9prwv/q/64j4X/0rS//r/vf9f//0rX///+m////9df///6b////1dL///+rg" + "iGpTIvkG2ZDS/IaX5DUpkpkNOCGXGQf8hmOR+QTyGnBKZDXoQ04I5kNqhJyGVBLiBc+QanIZ" + "4IZ4ISCOCOCDa5BUwgvxBeCJBFciuQz8Qxf/q4gg8EDBAwgeCB4IPCBgoLrkC/BBhBgoQMED" + "BQgYIGFBQoI1gokMzgWOMg9VkKGQwdY44//qwnphQhhHDDR1BQbJnnpkFCCGdGlkM6EGgyDc" + "hMI4QZBuhNDIEIVGx0ageQqAZoGAQMEoMJuCDBBhL/6unphHChGxwgg2FCCY9P9AvCp6aCDe" + "gwjg1qEg0F9pphbCB0mg1MBhf/Vo2K9GyYQQcIIHScKrWjZMgY8go/QWQUejhsI4bIGPRsmk" + "2QL+jZNAg5BR/ThSBHkMe9PbtpPX/+r0H0EG0g6TpXLx4MtPEJ3fS2IJiE7EJ0m3QINhIO6p" + "Pu/6039aX/pXvEJtLSDpNj8+GWn/S6aenVuKDpcS5pXIF+9tJu1dJ1pL/6em6etf9J6b/QXT" + "TdNpPTa9P//61aXWl/63/q6Wl/1/pdV19/XQ//dft039Vv9Nj03/7evv+l7vuk9Nr9j+6ujC" + "aTpaQqvZBp4gQ/q/6Qpa///hL///S6v/q/7SvSrcINP6t9////9Bf/97/3+2vTdN06SSWw0D" + "S8RIHgrU9f///0v/1//ZQDX/3XVj9IILDDQa+QyAatP15OJ+v+L//39fmoMz91dfTdbegpsg" + "0vIZAZlDd/8ff/3////sH+66tpPqkw8JJBivCPj//KgDF0v+eT////2/+nr3fSb0kga8IF//" + "PBt7S/9v//+vwb/bW1bq7SSfqg16X1/7df+3////hv/r9b9K/wwvS//9hhL/2////8g2Eft+" + "l0rdfq0P/93+GIX/t//39X5BUn/pN7ejG9Uvx9L0v/Bgv/b//61/D/39apNvSX//7v3y4bf/" + "b//f6/IZkP+6Wr0t2qX//1d74S/9v//X2//19+1Sf0iGH//XX1vS/9v/+60v//bWK6Stuv//" + "+m219f/b//f1tfrtetjpvVJf/sLpdq3r/7f/9pXTa/+sbWk2xSX/9owtoJttGFhkHfT/9v/9" + "urQTa9pWSHbRftbS+lX/thBcNJhkOOwwlsMJcqwyv+w//20rCUMI2v9pwwl9aTbS//xXDCCb" + "CsQrY1hra6sGtrrbaUNBMQtbSYpit/VvSBf/ak4ZzCFMbUkBsRDPU2QYrlAOawzyBFbkHrIP" + "WauUA5rCFAbGlEINZAhPDCCpqUBmp2gSg9D/9hdNNBrDC2//YXX+xCnkmF8U01vXTtf/hoaB" + "hAwQaEMEIOIjiyOGQCwCwwgYWIMEGgwh/EccfoREREI2CPEcRxEREa/wgg///hJ/6/0n/X/I" + "HiiX///pdfT+n/+tpePX9fhfX1bSyB49NKvptL7/1IHg1wEYA1CxdKvSEdtJLyBmDU/2l/YS" + "2wkl8eGGEEQPDXcJBBhBpYYhMQgQMgUVwsGaAeCsF7WIiI//////////////////////////" + "////////wAQAQA4AAAEDAAEAAADOBwAAAQEDAAEAAAB3AgAAAgEDAAEAAAABAAAAAwEDAAEA" + "AAAEAAAABgEDAAEAAAABAAAAEQEEAAEAAAAIAAAAEgEDAAEAAAABAAAAFQEDAAEAAAABAAAA" + "FgEDAAEAAAB3AgAAFwEEAAEAAABoDwAAGgEFAAEAAAAeEAAAGwEFAAEAAAAmEAAAHAEDAAEA" + "AAABAAAAKAEDAAEAAAACAAAAAAAAAAAAwBIAAAQAAADAEgAABAA="; + +static const char fontdata_18[] = + "SUkqAEARAAAmoCq/////////////////////////////////+QyXe5DJDVchncgthMyB4NFk" + "TMgeJBA8FKE06yB9ad5DbxIgScCpNkFYdSGnQgrOQbKENqhA3ghmWQz2QVRyBxZDMoQbJ4XU" + "g0YQl4IHhBhUm4OggwoIGCBhYwQZBuJggYIHhf1CJwazjaSdJNpqEGFQaYWgSwmg9d6yGanQ" + "Qb10m+gjxMKEGEGlhAtHhhhHyf/4QaVpIw3rZBpelQQbCpp+EFSCDaCDe/XSOMwbSfSDpJN3" + "1TYKqMyraC0nQTfT/pYaW0gv06dKk4Iz8+K4Qb9BUk2k/+ugt9+npbTXVtBcINwnWYAnTNg3" + "77f1+v1aS+k3dVXC6em0YXSqkrSv99UvX/S8N6q3C6dJ/0tLff/r9/S6pJsN0RB6rH2/S9JL" + "XX/r0v//WwxRfqt6XvXpaX1fv9f+lqlThjrf+tfS//////6pbdf910vrS9X+tdf9LSWsKQ1L" + "pfr/9fuv/f/H+1rcIzH+v8aS9LS17/yGwU96S0klsEf2OvePpfj3X+I/2v0l4Svr/S/SStf3" + "/9JwkwqevXf9L+m6/rvdLihW6vpfpL8jmktpf5A8WyEu+6She16/rSXggekwwgr/XvbXr2E3" + "1/SSXgmpHPYaWv+3tpJNEGt/H1/0viHhBpMU3/SyGoYhaZCg/v/0gSS7oINWtf9ifDVCSC6T" + "/X+Qa9Pnx1Tph3/0yEAkpr3Ba/pQaXBBvTUMNtf9hpI4mD+PX9JpdBvRwnV2F/2HhBOQxhFj" + "9f1mBh/TxBB0gjiDYYRxL1wbSIP6Tdj/X9QgbSxdJtQgg2xX/kNVPhA6t/1/SF/unpINwvel" + "DMbSCOG1b/IM4vX6TaW9OqQOGvogzCmD6TaT/5BSEL+k6X7aSTbSX+G0km+/9f+r/r0nDBf+" + "/TpN/9V1paWRjv6VNj/+kt7deQPBe9f0nQj99XS8geWEJe/6t/61fpf+lv8Kv0qb7S/FX9LX" + "9a6x1/X2/+v0v/pXX/0v20v110t69fr6IZcf/vv9daVENXt+vX/9L7bS6/9SGo//S9Ja/1/s" + "Va6t+ldZAu6V6X1/+l9tf11069//pZA9RX6/T/5BWhddK63p0krSSwnr9JOtsP8hteQLMpv0" + "tLtL1fS7/177Yb1qmvWk3X7aXaSWv/SXTcHr0nTa6IGBDXbSvSeku+r0ttJhhFIBO/XXS1tL" + "tJ0u1CXroPSSdWwj3f/ptJNbQSbaTaSTaQQXXw8JbDCCiE1117DSIZsBBlusMJENSAg4YQTD" + "CSsMIIILetkNQgkmKDQYVr00rFRGrEKJrDOKYqmKCC2FqDEVgwmEGnodqmvhbCYShhAgsREh" + "phpCDBBr0hUMIRBhCGCDCEMKCyGScCItpdCIiI/6S+9VX2uvvSX9qlXvWuraSVYtpUO9Jdqw" + "ttIdtLbS2mFiP///////////////////////////////////+QEwate8gaApwQPArqIZINtZ" + "A1DU1IHgpaEDwZCCC3wQPA4jyC2DJMgpIyG0BkFdQQUCZDUKSBAuQ1CZAuDIYBkFwZDAMguD" + "IYDIMAyGpqQ19CGNCGYnINYMg1DRBUBkGsbBEYDchgQQwwQYLlOGCIBc1A5GAxIEVENnkMqZ" + "BihBp4hoK5OB4KJBbBU1IbYxODBEaDORcGpYIH//63hA4MIHBhBxX/+QXDUJrwsIMIPDYRoC" + "MMGHDhGgOGGCDBBggYQYLDBBuEHDCCMw4YYYRmHYYaPBA3DBBhMEGEwSYYV9112EGpBXoQiA" + "gQNEDFCD6EGs5B6EDByCUCBA5AxQhmUIZtCGbQhmUR8Gg0BSonDMZBrwIEDZBqOQiAgQMMg1" + "nIQgIINZBvQg0YDNAzQgYLIKMdHAb0p8C69MIoCB3QdBB6IaEMIhsthEM9oIGmmmmmqaurpB" + "NsIG0E2wgbSDzAOZg9qnp9yGUdIN1BV84NozBh7hsJB3BvfdBP/6W6tukGHhtIMPDaT/7v6a" + "Qbw2lST8INhAgbT3QT7f+En/9LvvSb2wk3vXX/dfuk/pekHSb+0vDf+k//pevpP9P6T9P/uv" + "aVpf/aCDae6Xt/6X/4QX96Te2k3t//7pd09OlpfTpN/r7f/X/6XazCek36Tfpf/3+rat1per" + "03ML9Vv/r/+lzCza7et7re//+62vaTrpeOk636X3/pf/pfaXt9P9P///dPe9XX/pXT+vt44/" + "/6Xv/et+t+uOP/zCpNpNpCl5DIBocgeDj9Ot/Q/6Q/+l917+/7/j+6Wt+rpJeFh6RDH3T9Lt" + "+v/pe6+3pfpf/9/vt1el4WDrCDNzrev/1/6X3Xt/f99f7q2l1pOlXhYapBH2//qv//9L3X2/" + "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" + "3rmI8DTd/Wm60qS/9Lp4p10nSfVngzQg/6XCYTwg6txTpcQnVx/6e90m66//b7ptL3W+rq/0" + "F003V03Ta9Nf+2utWlrpf+l709Ol/77/hL/3Xp66f/+r1bS61//bHq1/SfXr/S6p69utfHH9" + "906em8UktshpYQ2P6X7+v/+/6Xv7pe2vV/2lzH7S1S/CBw/2/0hr7//9Bf/7/X3/9+k2r1SW" + "2g0vS//1///CX//e/8H+2lpXvVqkltoNLxEgeBORvr/9f+v/6//shhp/991iulBAsGDRww18" + "hkArV+vx9//F//7+vynBo+3WldNN6QMPBAkgwYS8ETv/9el/3////sP/W999JJh6SQYrwjMX" + "/8pAy7f/zyf///+w//dLSt+m9Kg16Bf/z4K+0v/b////w3+3X3vapfpA16X1/7aX/t///1+D" + "f+tq9JvSvpYYXpf/+wwgv/b////wb/bp6tbvSv2h9L+7/Yr/2//7/vyCuR/r/oxvSS/H/1/8" + "ML/2//+tL8H/erSel36/9L6/vBgv/b//f/8P/a/apN2kl//+22r6MArf9v//+n8g1O//TpPS" + "Tb6//+l/4S/9v/+0tb//Vtb7VK70iC8f/r1drel/7f//9f/69R/vpJf//q2+3pf+3/+3Wtr9" + "er7T0k231//YXS7X1/9v//StJtf+1j40rikq//RhbQTDbRhWyBA+n/7f/7faCte0rtG1qnSb" + "df/20uGk3YS4YXv/2//20oaTYRtf7Juwwgt3pXpJf/sILgwgmGQsMMILYYXlIGZ/2H/+2lDB" + "BMMJfDSjiuvSt0l/9irMPFMUxVsUnDTtPTYaaYTtO2GEopiFoM0WEmqTenVukP/6jmEnakgC" + "6IaE7DIMDJIDBThokNCdyC6cgunLGSGCEYHJANxChMLIaBEQqakMGn0CTB6/+wtIMINBrYLf" + "/2F/+wp5INegmmFtNPW//4NDQMIMEDQgwhBsRHEMjhkhAsGEDCxBhBoGEP4jQ4/iIiIhHATi" + "OI4iIiP/hBA3/X+Eg///pf9f6T/r/ZA8OLf//+l16T1///a6/S+k9aj//a5Arq0q9JtL//wY" + "YQLdtKvSEcdV8gaIddtKvTS20kvj2GEkvrYYIIgeCsOEggyB6sIOtiFFEFsGRPE6AZgsLDCY" + "XsFkDYDScREcf////////////////////////////////////4AIAIAADgAAAQMAAQAAAIEI" + "AAABAQMAAQAAAIsCAAACAQMAAQAAAAEAAAADAQMAAQAAAAQAAAAGAQMAAQAAAAEAAAARAQQA" + "AQAAAAgAAAASAQMAAQAAAAEAAAAVAQMAAQAAAAEAAAAWAQMAAQAAAIsCAAAXAQQAAQAAADcR" + "AAAaAQUAAQAAAO4RAAAbAQUAAQAAAPYRAAAcAQMAAQAAAAEAAAAoAQMAAQAAAAIAAAAAAAAA" + "AADAEgAABAAAAMASAAAEAA=="; + +static const char fontdata_20[] = + "SUkqABATAAAmoDgf////////////////////////////+QyQy7IGwGXPIZILLkNA/kDwVrIW" + "3IHgvBA8FqE00sgeC9pp5BWhIFSvIHhpOQPDToQK3ILYb01TTINOELmCJwypBY8FVsgy2kQ1" + "6BSCocEDBSDQBEFfCBcWINJwQeF/qDCDSCD0m4eCBhSDZWEGFwTwQMIPC1VKQa6keMPTpJu8" + "IMKEGmuECwg0fIP3dcIGgg2kE9JukkeGwqDQaWECwj42EEG//wiRhpN6ON0lZDSetBBsFTXw" + "gqQQNoJv/9HnJetpIJ1201SSbCpo0JroLQTdP/+EFh6b1ekm060mwRp5mNwQb8JUrat//1uu" + "kk+laeklhBaBA6QdZsCsKcAwqdK/qukv3/pXuvbgum4TaMLpUq3T7u9KltVaS61bfpcLp6/p" + "Kqp1vr1/1/qlcNpJK2wvfdL0tf3//X/S+qsGMjvrHpuuvS6XS//6//SVWw0c6X/q6+lr/f//" + "/pfXhj1b/9L0uv3+mvX/9JJLyGtiX9PX+uvr+/VePpf7YR9f/XGkvqquv/1X+u0klwUi3pL/" + "/66Wvf+Qbi/uqWklVhGaY/Xj6XpD3X+I/37pVuCT/36SX6Vpf1/0lpQl6vS/qv0lbr/720u0" + "h7hX+/6XkWfVpfv+6pRVbXpL+kvggaqw0r/IHgmELd7aWwldq//SSrwg6qGEtfpW9hoJKu2v" + "S/0kvCakWisNL/Xg8MV5DNp43/9IL4h4QaTEJv/4wwSSkEUf6X6gklrhB0+v+yXBmprW//0Q" + "06l5mK0k1DDv/5JgUIJrvBf+lB1wgbwnTDbX/Yejyh1sdL/tLhPo8TW9fqgw0kmyC/Eu//0k" + "cGH9NxBA2kEGwwjaX6hvIYmleP6X6UEG0tp0n0cbYYS+lyGqESCDSd//+hbXF4TaQSBuK/8h" + "tJ8I8w0m/9L9J673VINsL3+YbSQQbSv8gflZA4Cf6TaW9dJBsNJeQPyjD6Te3//+k/+2lTtf" + "+G0ltW/+kv0rS+vScGC/9+nr/1+utcijv6STY1/6S3t1/SX6vEfuu6/7/q3+QPDZi7fpa/0r" + "/RA8PhC56VN7a/il+lr+tdY/+vt1//pf+krr/6X9/6WulvX/1//+2k9f1pUQ1/30vS6ohmv6" + "X22tr/6RBsH//9dV+v9uv0m/SC110vVf/pfsV/9aTrkDELel6X//9tfpfpXX06/pZA8Hj/SS" + "6d+sgy3uul+39JWklhB//utsN/BSB4b4lddNpeler6X1rpJX3DtcKn/pdbaTpVpJaa1f/TcP" + "+k0m0tItXaX16t0l+vpJOkw0GQg71r7+h2l2k2lVqEv+Hpba2EeRrn/S9patpJthJulbSQX/" + "D0km0mdWmKtfdJtJNYYSuGEmwkraQS/4eEttBMQg09de2kQaUiygwiGuTk5ptKmGEEEFtexE" + "JJimgwv+kmDBLWK2ITBgkrBgkCC2qwYWDBBhBp0hSDWGIXwuExCoMQgQLERIauiQhggwr8Ug" + "whEGCEMEGEIYUFkMkMyMgeC/EMu+qwZwMgMo4B4axwDg8B4axwG0LxEW1SxEREfetL9Uv26p" + "L9JfVvpL20kv+qSxbSUd1S26YW2kO2ltpb1tNYj/////////////////////////////////" + "5AWBqr/IGoNMEMgk5DJBaGEDYGKyB4FlZA8CjQgtgYghkJ/IGYMUIHCLIKgkCKsC5QCHQNcl" + "oaCWBqlIGYVAMFWGCoBcqwXKgCDoDBUBrmoFQ1Bg6g1EQGmVYaREwZCrDSIoCqDIGKEDGhDC" + "ghnGEMAyBCchgvZDRWQUYQzaENEyGlMhsBfBAyCuMWRYFYjYaBKcNPQIiYF//9reEHIuG0HB" + "hA4r//IMEZBcOuaAeGnCDBA+wg4Pwgf//94QcMIOGEH/+uE1tetMIOyDIKBFAPIKCwhpi5DK" + "FQigGEQzCCGaQQzCCGaQQzCEaBmkgFNokBlshpzCJwcMhpaEQgInBwyGloRA0fD8g3IINPkD" + "CCDTMgoRkDE7R8NDqvTCJAQNQzMEYQIhsoGZgQ2aBns0BiEaAXtNNNNIJp6baQIG2aAu0CBt" + "mgLsIIPtNO01YaIGEUQMISnwy9do0Ah3g6CD5BQG5BRbkG9oIO00000gmm0naCCDDcNhBBhu" + "G6DzYYNAxap91oNpN1BV84Kwggw120EHwb38JB//S/vSb20m90nrf+vVtJtKkvQQbQQbvcJN" + "Yb/0E//pdrekG9tIN7aT7/v970/pfToIN+2gvb/pL/9L+9Jv0m/S//tLWm1bS/90m19L2/9J" + "//S770n3Sb2+v/fb/SetL0m0E97r7f+l/+l6za9X3X6//3Xat02lpf6TaNr9e3/1/+lzac2u" + "3pN7pN71//rrTaT1pfT0336Xv/r/+l+v3q/q///71362vXjq6T+vt44pf/pe3Xt9X9X6v/9q" + "2u3Tpa/pX39ff//6C/X29X9X/Ecff5tV0m6FLyGQCm5A8ND9Pv0kO/pD/6XvXv9/3//1902l" + "apeFg9SGKE/tL////0vtfb0n9J//7XSfb3pLwsOqCe+3qvfr/6XvXt/fXfX+9P/pWlXhYapB" + "GZv0vqt/r/0vtfv//1v+1vbSbSdV8Fh1oJtb76X///S969vV9Vfr/f0v6bpLyB4eyDVYSDDS" + "0unSfS/yGeMhnhf/S+19+vqvW/+v9tdJL0GEwggw9JJ//S+///9L3r2/v++r/tdJtXSbWvWw" + "gQYaWsfTelW//X/pfa+3/pfpMP96b+rrpL7TCCDBpaXr4QS////oL+vvV/V9KH/f/sU2kv+E" + "EGGlpV7eCC//1/9L2/2/9L9JmoFn7paTf6pf4QQYaSX6XEwGn//4/0v0vf/S/CCkICn//0mm" + "6S/wQRDTKwYaWl/cgQZn8Lhf/X2/2/8JfkKdlICt+1dJvabSr6aCCww6+tJ4P+OP/0/0vb/y" + "xwQX5tWD/er/v196CCww0tf+Zh3///F+3/f+1/BMP+//bbSS9hBoILDDS6VJJvBh//zMGv9/" + "pe3/wX7Qb/dLSbS40vEQgWGDS//w3///37f7/8F+2Df/v/bVeEEIYaWte3hv6mYEZmBH/5nv" + "9fb/x/bIKYT9tbX09Lwggw0v0kvf/ff/9v3r2//9yCwn/66bSV18EEDDrpf+////9v7X77ru" + "tsgtB///zadJfCDaX9JN73r/3/7fvXt//9h/20tL0ndL4Qer0lj7fr/yGZZBI/9v7X3//22/" + "/fb1vr4Qff6T3//3i//b969vf39sP+2trpJN6XwwX/X/////2/tfb9L0t//rp+vX4YX3SSv7" + "6xxshpI/9h+9e339/b//96t6XhhhBPeqSNgY++v4f/2/v+//9v/bSdLpJvrwwYQVu3LrX/fX" + "u//t+6XvvW9bb//e2qXpeGGEE3elqrf+v3/+39/t9r37/7df+3peGGQ2ysIJp20sIKv2+v//" + "2/0vb+vS7/9dL0vXww8ECG2wk4SW+vX2//w37f7e37+3Xpe+2kk3peGHhBOGKiieU/t9ZDLj" + "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" + "v/b//f1v/7V6er0r9L//XSttb1/9v//rptfr+1jY0ntUq/+197X1/9v/+0rS1/9XqqVtiqX/" + "9bQVtowrZDYPr/7D//b7SYa9pW2jCxu6V6//thG/aTdhLbC9/+3/+6VoK1/yKPYS3rSbaS//" + "hhLhhJhkMOwwlw15AgaP+3//aVpMMEc/aVhOGEuulfS//iFoMIJhhWKthhJYd2urBra922lB" + "ggmK1tJimK/eraSBf/asqIpgwVqGwYJBA2GCDhhA8IG2EDBAwQODBBw2GlFMLCKcDDCVVBu1" + "hJh6H/7Cjm0ExQanQMoUQ2F7IEF50DBLhokNghyGC5DBcEDnQHIgEOgFwYIKE1kNgOUGE0wo" + "OtoKw9f/a6DQaDC2Cw//sF/+xCn0gwvimg1vXW0//hhDQMIMEDQgwhDYiOLLhkhlBYMEDCxD" + "BBoMEO+I44/iIkCThILGBHgTiQyQaOxHIHh+EREa/xFBEM58fH/sIJ/6/wk///pP+l/kDwIK" + "////X/3r+uvStf///8ev0nrC+v9pZA8WvSr0g2l//7aXtpfqJTgi4GwGeP16QjtpJeQNAanX" + "tL+0tsJJehWwwgklX2GEgkmg6wxCBIgZiCCB+DrDChfCyBtDOdkcDMMcMLEREf//////////" + "////////////////////4AIAIAAOAAABAwABAAAATAkAAAEBAwABAAAAcwIAAAIBAwABAAAA" + "AQAAAAMBAwABAAAABAAAAAYBAwABAAAAAQAAABEBBAABAAAACAAAABIBAwABAAAAAQAAABUB" + "AwABAAAAAQAAABYBAwABAAAAcwIAABcBBAABAAAABxMAABoBBQABAAAAvhMAABsBBQABAAAA" + "xhMAABwBAwABAAAAAQAAACgBAwABAAAAAgAAAAAAAAAAAMASAAAEAAAAwBIAAAQA"; + +#endif /* LEPTONICA_BMFDATA_H */ + + diff --git a/third_party/leptonica/uos/amd64/include/leptonica/bmp.h b/third_party/leptonica/uos/amd64/include/leptonica/bmp.h new file mode 100644 index 00000000..568c9901 --- /dev/null +++ b/third_party/leptonica/uos/amd64/include/leptonica/bmp.h @@ -0,0 +1,124 @@ +/*====================================================================* + - Copyright (C) 2001 Leptonica. All rights reserved. + - + - Redistribution and use in source and binary forms, with or without + - modification, are permitted provided that the following conditions + - are met: + - 1. Redistributions of source code must retain the above copyright + - notice, this list of conditions and the following disclaimer. + - 2. Redistributions in binary form must reproduce the above + - copyright notice, this list of conditions and the following + - disclaimer in the documentation and/or other materials + - provided with the distribution. + - + - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ANY + - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *====================================================================*/ + +#ifndef LEPTONICA_BMP_H +#define LEPTONICA_BMP_H + +/*! + * \file bmp.h + * + *
+ * This file is here to describe the fields in the header of + * the BMP file. These fields are not used directly in Leptonica. + * The only thing we use are the sizes of these two headers. + * Furthermore, because of potential namespace conflicts with + * the typedefs and defined sizes, we have changed the names + * to protect anyone who may also need to use the original definitions. + * Thanks to J. D. Bryan for pointing out the potential problems when + * developing on Win32 compatible systems. + *+ */ + +/*-------------------------------------------------------------* + * BMP file header * + *-------------------------------------------------------------*/ + +/*! BMP file header + * + * Notes: + * (1) The bfSize field is stored as a 32 bit integer and includes + * the size of the BMP_FileHeader, BMP_InfoHeader, the color + * table (if any), and the size of the DIB bits. + * (2) The bfOffBits field is also stored as a 32 bit integer and + * contains the absolute offset in bytes of the image data + * in this file. Some bmp files have additional data after the + * BMP_InfoHeader and before the color table (if it exists). + * However, enabling reading of these files makes the reader + * vulnerable to various malware attacks. Therefore we do not + * read bmp files with extra data, and require that the size + * of the color table in bytes is + * offset - sizeof(BMP_FileHeader) - sizeof(BMP_InfoHeader) + * (3) Use arrays of l_uint8[] to make an endianness agnostic + * access to the BMP_FileHeader easier. + */ +struct BMP_FileHeader +{ + l_uint8 bfType[2]; /*!< file type; must be "BM" */ + l_uint8 bfSize[4]; /*!< length of the file; + sizeof(BMP_FileHeader) + + sizeof(BMP_InfoHeader) + + size of optional extra data + + size of color table + + size of DIB bits */ + l_uint8 bfReserved1[2]; /*!< don't care (set to 0) */ + l_uint8 bfReserved2[2]; /*!< don't care (set to 0) */ + l_uint8 bfOffBits[4]; /*!< offset from beginning of file */ +}; +typedef struct BMP_FileHeader BMP_FH; + +/*! Number of bytes in a BMP file header */ +#define BMP_FHBYTES sizeof(BMP_FH) + + +/*-------------------------------------------------------------* + * BMP info header * + *-------------------------------------------------------------*/ + +/*! BMP info header */ +struct BMP_InfoHeader +{ + l_int32 biSize; /*!< size of the BMP_InfoHeader struct */ + l_int32 biWidth; /*!< bitmap width in pixels */ + l_int32 biHeight; /*!< bitmap height in pixels */ + l_int16 biPlanes; /*!< number of bitmap planes */ + l_int16 biBitCount; /*!< number of bits per pixel */ + l_int32 biCompression; /*!< compress format (0 == uncompressed) */ + l_int32 biSizeImage; /*!< size of image in bytes */ + l_int32 biXPelsPerMeter; /*!< pixels per meter in x direction */ + l_int32 biYPelsPerMeter; /*!< pixels per meter in y direction */ + l_int32 biClrUsed; /*!< number of colors used */ + l_int32 biClrImportant; /*!< number of important colors used */ +}; +typedef struct BMP_InfoHeader BMP_IH; + +/*! Number of bytes in a BMP info header */ +#define BMP_IHBYTES sizeof(BMP_IH) + + +/*-------------------------------------------------------------* + * Align BMP headers on 4 byte boundaries * + *-------------------------------------------------------------*/ + +/*! BMP_IH is misaligned, causing crashes on some big-endians. + * A packed struct forces alignment. */ +#if defined(__GNUC__) +typedef struct __attribute__((__packed__)) { + BMP_FH bmpfh; + BMP_IH bmpih; +} BMP_HEADER; +#endif + +#endif /* LEPTONICA_BMP_H */ diff --git a/third_party/leptonica/uos/amd64/include/leptonica/ccbord.h b/third_party/leptonica/uos/amd64/include/leptonica/ccbord.h new file mode 100644 index 00000000..675b92b2 --- /dev/null +++ b/third_party/leptonica/uos/amd64/include/leptonica/ccbord.h @@ -0,0 +1,62 @@ +/*====================================================================* + - Copyright (C) 2001 Leptonica. All rights reserved. + - + - Redistribution and use in source and binary forms, with or without + - modification, are permitted provided that the following conditions + - are met: + - 1. Redistributions of source code must retain the above copyright + - notice, this list of conditions and the following disclaimer. + - 2. Redistributions in binary form must reproduce the above + - copyright notice, this list of conditions and the following + - disclaimer in the documentation and/or other materials + - provided with the distribution. + - + - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ANY + - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *====================================================================*/ + +#ifndef LEPTONICA_CCBORD_H +#define LEPTONICA_CCBORD_H + +/*! + * \file ccbord.h + * + *
+ * + * This is the public interface for representing all foreground pixels + * in an image by the border pixels of connected components. It contains + * typedefs for data structures and enums for function inputs. + *+ */ + +/*! A single CCBord for a connected component */ +typedef struct CCBord CCBORD; + +/*! Array of CCBord */ +typedef struct CCBorda CCBORDA; + + /*! Use in ccbaStepChainsToPixCoords() */ +/*! CCB Coords */ +enum { + CCB_LOCAL_COORDS = 1, + CCB_GLOBAL_COORDS = 2 +}; + + /*! Use in ccbaGenerateSPGlobalLocs() */ +/*! CCB Points */ +enum { + CCB_SAVE_ALL_PTS = 1, + CCB_SAVE_TURNING_PTS = 2 +}; + +#endif /* LEPTONICA_CCBORD_H */ + diff --git a/third_party/leptonica/uos/amd64/include/leptonica/ccbord_internal.h b/third_party/leptonica/uos/amd64/include/leptonica/ccbord_internal.h new file mode 100644 index 00000000..c84f6d74 --- /dev/null +++ b/third_party/leptonica/uos/amd64/include/leptonica/ccbord_internal.h @@ -0,0 +1,107 @@ +/*====================================================================* + - Copyright (C) 2001 Leptonica. All rights reserved. + - + - Redistribution and use in source and binary forms, with or without + - modification, are permitted provided that the following conditions + - are met: + - 1. Redistributions of source code must retain the above copyright + - notice, this list of conditions and the following disclaimer. + - 2. Redistributions in binary form must reproduce the above + - copyright notice, this list of conditions and the following + - disclaimer in the documentation and/or other materials + - provided with the distribution. + - + - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ANY + - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *====================================================================*/ + +#ifndef LEPTONICA_CCBORD_INTERNAL_H +#define LEPTONICA_CCBORD_INTERNAL_H + +/*! + * \file ccbord_internal.h + * + *
+ * + * This file is internal; it is not part of the public interface. + * It contains definitions of data structures that use border pixels + * of connected components to represent the foreground pixels + * in an image by the border + * + * CCBord: represents a single connected component + * CCBorda: an array of CCBord + * + * The CCBord contains: + * + * (1) a minimally-clipped bitmap of the component (pix), + * (2) a boxa consisting of: + * for the primary component: + * (xul, yul) pixel location in global coords + * (w, h) of the bitmap + * for the hole components: + * (x, y) in relative coordinates in primary component + * (w, h) of the hole border (which is 2 pixels + * larger in each direction than the hole itself) + * (3) a pta ('start') of the initial border pixel location for each + * closed curve, all in relative coordinates of the primary + * component. This is given for the primary component, + * followed by the hole components, if any. + * (4) a refcount of the ccbord; used internally when a ccbord + * is accessed from a ccborda (array of ccbord) + * (5) a ptaa for the chain code for the border in relative + * coordinates, where the first pta is the exterior border + * and all other pta are for interior borders (holes) + * (6) a ptaa for the global pixel loc rendition of the border, + * where the first pta is the exterior border and all other + * pta are for interior borders (holes). + * This is derived from the local or step chain code. + * (7) a numaa for the chain code for the border as orientation + * directions between successive border pixels, where + * the first numa is the exterior border and all other + * numa are for interior borders (holes). This is derived + * from the local chain code. The 8 directions are 0 - 7. + * (8) a pta for a single chain for each c.c., comprised of outer + * and hole borders, plus cut paths between them, all in + * local coords. + * (9) a pta for a single chain for each c.c., comprised of outer + * and hole borders, plus cut paths between them, all in + * global coords. + *+ */ + +/*! A single CCBord for a connected component */ +struct CCBord +{ + struct Pix *pix; /*!< component bitmap (min size) */ + struct Boxa *boxa; /*!< regions of each closed curve */ + struct Pta *start; /*!< initial border pixel locations */ + l_atomic refcount; /*!< number of handles; start at 1 */ + struct Ptaa *local; /*!< ptaa of chain pixels (local) */ + struct Ptaa *global; /*!< ptaa of chain pixels (global) */ + struct Numaa *step; /*!< numaa of chain code (step dir) */ + struct Pta *splocal; /*!< pta of single chain (local) */ + struct Pta *spglobal; /*!< pta of single chain (global) */ +}; + +/*! Array of CCBord */ +struct CCBorda +{ + struct Pix *pix; /*!< input pix (may be null) */ + l_int32 w; /*!< width of pix */ + l_int32 h; /*!< height of pix */ + l_int32 n; /*!< number of ccbord in ptr array */ + l_int32 nalloc; /*!< number of ccbord ptrs allocated */ + struct CCBord **ccb; /*!< ccb ptr array */ +}; + +#endif /* LEPTONICA_CCBORD_INTERNAL_H */ + diff --git a/third_party/leptonica/uos/amd64/include/leptonica/colorfill.h b/third_party/leptonica/uos/amd64/include/leptonica/colorfill.h new file mode 100644 index 00000000..2d3a8679 --- /dev/null +++ b/third_party/leptonica/uos/amd64/include/leptonica/colorfill.h @@ -0,0 +1,67 @@ +/*====================================================================* + - Copyright (C) 2001 Leptonica. All rights reserved. + - + - Redistribution and use in source and binary forms, with or without + - modification, are permitted provided that the following conditions + - are met: + - 1. Redistributions of source code must retain the above copyright + - notice, this list of conditions and the following disclaimer. + - 2. Redistributions in binary form must reproduce the above + - copyright notice, this list of conditions and the following + - disclaimer in the documentation and/or other materials + - provided with the distribution. + - + - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ANY + - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *====================================================================*/ + +#ifndef LEPTONICA_COLORFILL_H +#define LEPTONICA_COLORFILL_H + +/*! + * \file colorfill.h + * + *
+ * Contains the following struct + * struct L_Colorfill + * + * This accumulates color information, linked to location, within a + * set of tiles that (mostly) covers an input RGB image. + *+ */ + + +/*------------------------------------------------------------------------* + * Colorfill data * + *------------------------------------------------------------------------*/ +/*! Colorfill data */ +struct L_Colorfill +{ + struct Pix *pixs; /*!< clone of source pix */ + struct Pix *pixst; /*!< source pix, after optional transform */ + l_int32 nx; /*!< number of tiles in each tile row */ + l_int32 ny; /*!< number of tiles in each tile column */ + l_int32 tw; /*!< width of each tile */ + l_int32 th; /*!< height of each tile */ + l_int32 minarea; /*!< min number of pixels in a color region */ + struct Boxa *boxas; /*!< tile locations */ + struct Pixa *pixas; /*!< tiles from source pix */ + struct Pixa *pixam; /*!< mask tiles with components covering */ + /*!< regions with similar color */ + struct Numaa *naa; /*!< sizes of color regions (in pixels) */ + struct L_Dnaa *dnaa; /*!< average color in each region */ + struct Pixa *pixadb; /*!< debug reconstruction from segmentation */ +}; +typedef struct L_Colorfill L_COLORFILL; + + +#endif /* LEPTONICA_COLORFILL_H */ diff --git a/third_party/leptonica/uos/amd64/include/leptonica/dewarp.h b/third_party/leptonica/uos/amd64/include/leptonica/dewarp.h new file mode 100644 index 00000000..37bfb632 --- /dev/null +++ b/third_party/leptonica/uos/amd64/include/leptonica/dewarp.h @@ -0,0 +1,191 @@ +/*====================================================================* + - Copyright (C) 2001 Leptonica. All rights reserved. + - + - Redistribution and use in source and binary forms, with or without + - modification, are permitted provided that the following conditions + - are met: + - 1. Redistributions of source code must retain the above copyright + - notice, this list of conditions and the following disclaimer. + - 2. Redistributions in binary form must reproduce the above + - copyright notice, this list of conditions and the following + - disclaimer in the documentation and/or other materials + - provided with the distribution. + - + - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ANY + - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *====================================================================*/ + +#ifndef LEPTONICA_DEWARP_H +#define LEPTONICA_DEWARP_H + +/*! + * \file dewarp.h + * + *
+ * Data structure to hold arrays and results for generating + * horizontal and vertical disparity arrays based on textlines. + * Each disparity array is two-dimensional. The vertical disparity + * array gives a vertical displacement, relative to the lowest point + * in the textlines. The horizontal disparty array gives a horizontal + * displacement, relative to the minimum values (for even pages) + * or maximum values (for odd pages) of the left and right ends of + * full textlines. Horizontal alignment always involves translations + * away from the book gutter. + * + * We have intentionally separated the process of building models + * from the rendering process that uses the models. For any page, + * the building operation either creates an actual model (that is, + * a model with at least the vertical disparity being computed, and + * for which the 'success' flag is set) or fails to create a model. + * However, at rendering time, a page can have one of two different + * types of models. + * (1) A valid model is an actual model that meets the rendering + * constraints, which are limits on model curvature parameters. + * See dewarpaTestForValidModel() for details. + * Valid models are identified by dewarpaInsertRefModels(), + * which sets the 'vvalid' and 'hvalid' fields. Only valid + * models are used for rendering. + * (2) A reference model is used by a page that doesn't have + * a valid model, but has a nearby valid model of the same + * parity (even/odd page) that it can use. The range in pages + * to search for a valid model is given by the 'maxdist' field. + * + * At the rendering stage, vertical and horizontal disparities are + * treated differently. It is somewhat more robust to generate + * vertical disparity models (VDM) than horizontal disparity + * models (HDM). A valid VDM is required for any correction to + * be made; if a valid VDM is not available, just use the input + * image. Otherwise, assuming it is available, the use of the + * HDM is controlled by two fields: 'useboth' and 'check_columns'. + * (a) With useboth == 0, we use only the VDM. + * (b) With useboth == 1, we require using the VDM and, if a valid + * horizontal disparity model (HDM) is available, we also use it. + * (c) With check_columns == 1, check for multiple columns and if + * true, only use the VDM, even if a valid HDM is available. + * Note that 'check_columns' takes precedence over 'useboth' + * when there is more than 1 column of text. By default, + * check_columns == 0. + * + * The 'maxdist' parameter is input when the dewarpa is created. + * The other rendering parameters have default values given in dewarp1.c. + * All parameters used by rendering can be set (or reset) using accessors. + * + * After dewarping, use of the VDM will cause all points on each + * altered curve to have a y-value equal to the minimum. Use of + * the HDA will cause the left and right edges of the textlines + * to be vertically aligned if they had been typeset flush-left + * and flush-right, respectively. + * + * The sampled disparity arrays are expanded to full resolution, + * using linear interpolation, and this is further expanded + * by slope continuation to the right and below if the image + * is larger than the full resolution disparity arrays. Then + * the disparity correction can be applied to the input image. + * If the input pix are 2x reduced, the expansion from sampled + * to full res uses the product of (sampling) * (redfactor). + * + * The most accurate results are produced at full resolution, and + * this is generally recommended. + *+ */ + + /*! Dewarp version for serialization + *
+ * Note on versioning of the serialization of this data structure: + * The dewarping utility and the stored data can be expected to change. + * In most situations, the serialized version is ephemeral -- it is + * not needed after being used. No functions will be provided to + * convert between different versions. + *+ */ +#define DEWARP_VERSION_NUMBER 4 + +/*! Data structure to hold a number of Dewarp */ +struct L_Dewarpa +{ + l_int32 nalloc; /*!< size of dewarp ptr array */ + l_int32 maxpage; /*!< maximum page number in array */ + struct L_Dewarp **dewarp; /*!< array of ptrs to page dewarp */ + struct L_Dewarp **dewarpcache; /*!< array of ptrs to cached dewarps */ + struct Numa *namodels; /*!< list of page numbers for pages */ + /*!< with page models */ + struct Numa *napages; /*!< list of page numbers with either */ + /*!< page models or ref page models */ + l_int32 redfactor; /*!< reduction factor of input: 1 or 2 */ + l_int32 sampling; /*!< disparity arrays sampling factor */ + l_int32 minlines; /*!< min number of long lines required */ + l_int32 maxdist; /*!< max distance for getting ref page */ + l_int32 max_linecurv; /*!< maximum abs line curvature, */ + /*!< in micro-units */ + l_int32 min_diff_linecurv; /*!< minimum abs diff line */ + /*!< curvature in micro-units */ + l_int32 max_diff_linecurv; /*!< maximum abs diff line */ + /*!< curvature in micro-units */ + l_int32 max_edgeslope; /*!< maximum abs left or right edge */ + /*!< slope, in milli-units */ + l_int32 max_edgecurv; /*!< maximum abs left or right edge */ + /*!< curvature, in micro-units */ + l_int32 max_diff_edgecurv; /*!< maximum abs diff left-right */ + /*!< edge curvature, in micro-units */ + l_int32 useboth; /*!< use both disparity arrays if */ + /*!< available; only vertical otherwise */ + l_int32 check_columns; /*!< if there are multiple columns, */ + /*!< only use the vertical disparity */ + /*!< array */ + l_int32 modelsready; /*!< invalid models have been removed */ + /*!< and refs built against valid set */ +}; +typedef struct L_Dewarpa L_DEWARPA; + + +/*! Data structure for a single dewarp */ +struct L_Dewarp +{ + struct L_Dewarpa *dewa; /*!< ptr to parent (not owned) */ + struct Pix *pixs; /*!< source pix, 1 bpp */ + struct FPix *sampvdispar; /*!< sampled vert disparity array */ + struct FPix *samphdispar; /*!< sampled horiz disparity array */ + struct FPix *sampydispar; /*!< sampled slope h-disparity array */ + struct FPix *fullvdispar; /*!< full vert disparity array */ + struct FPix *fullhdispar; /*!< full horiz disparity array */ + struct FPix *fullydispar; /*!< full slope h-disparity array */ + struct Numa *namidys; /*!< sorted y val of midpoint each line */ + struct Numa *nacurves; /*!< sorted curvature of each line */ + l_int32 w; /*!< width of source image */ + l_int32 h; /*!< height of source image */ + l_int32 pageno; /*!< page number; important for reuse */ + l_int32 sampling; /*!< sampling factor of disparity arrays */ + l_int32 redfactor; /*!< reduction factor of pixs: 1 or 2 */ + l_int32 minlines; /*!< min number of long lines required */ + l_int32 nlines; /*!< number of long lines found */ + l_int32 mincurv; /*!< min line curvature in micro-units */ + l_int32 maxcurv; /*!< max line curvature in micro-units */ + l_int32 leftslope; /*!< left edge slope in milli-units */ + l_int32 rightslope; /*!< right edge slope in milli-units */ + l_int32 leftcurv; /*!< left edge curvature in micro-units */ + l_int32 rightcurv; /*!< right edge curvature in micro-units*/ + l_int32 nx; /*!< number of sampling pts in x-dir */ + l_int32 ny; /*!< number of sampling pts in y-dir */ + l_int32 hasref; /*!< 0 if normal; 1 if has a refpage */ + l_int32 refpage; /*!< page with disparity model to use */ + l_int32 vsuccess; /*!< sets to 1 if vert disparity builds */ + l_int32 hsuccess; /*!< sets to 1 if horiz disparity builds */ + l_int32 ysuccess; /*!< sets to 1 if slope disparity builds */ + l_int32 vvalid; /*!< sets to 1 if valid vert disparity */ + l_int32 hvalid; /*!< sets to 1 if valid horiz disparity */ + l_int32 skip_horiz; /*!< if 1, skip horiz disparity */ + /*!< correction */ + l_int32 debug; /*!< set to 1 if debug output requested */ +}; +typedef struct L_Dewarp L_DEWARP; + +#endif /* LEPTONICA_DEWARP_H */ diff --git a/third_party/leptonica/uos/amd64/include/leptonica/endianness.h b/third_party/leptonica/uos/amd64/include/leptonica/endianness.h new file mode 100644 index 00000000..8cdc060d --- /dev/null +++ b/third_party/leptonica/uos/amd64/include/leptonica/endianness.h @@ -0,0 +1,11 @@ +#if !defined (L_BIG_ENDIAN) && !defined (L_LITTLE_ENDIAN) +# if defined (__APPLE_CC__) +# ifdef __BIG_ENDIAN__ +# define L_BIG_ENDIAN +# else +# define L_LITTLE_ENDIAN +# endif +# else +# define L_LITTLE_ENDIAN +# endif +#endif diff --git a/third_party/leptonica/uos/amd64/include/leptonica/environ.h b/third_party/leptonica/uos/amd64/include/leptonica/environ.h new file mode 100644 index 00000000..b3095b23 --- /dev/null +++ b/third_party/leptonica/uos/amd64/include/leptonica/environ.h @@ -0,0 +1,608 @@ +/*====================================================================* + - Copyright (C) 2001 Leptonica. All rights reserved. + - + - Redistribution and use in source and binary forms, with or without + - modification, are permitted provided that the following conditions + - are met: + - 1. Redistributions of source code must retain the above copyright + - notice, this list of conditions and the following disclaimer. + - 2. Redistributions in binary form must reproduce the above + - copyright notice, this list of conditions and the following + - disclaimer in the documentation and/or other materials + - provided with the distribution. + - + - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ANY + - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *====================================================================*/ + +#ifndef LEPTONICA_ENVIRON_H +#define LEPTONICA_ENVIRON_H + +/*------------------------------------------------------------------------* + * Defines and includes differ for Unix and Windows. Also for Windows, * + * differentiate between conditionals based on platform and compiler. * + * For platforms: * + * _WIN32 => Windows, 32- or 64-bit * + * _WIN64 => Windows, 64-bit only * + * __CYGWIN__ => Cygwin * + * For compilers: * + * __GNUC__ => gcc * + * _MSC_VER => msvc * + *------------------------------------------------------------------------*/ + +/* MS VC++ does not provide stdint.h, so define the missing types here */ + + +#ifndef _MSC_VER +#include
+ * Usage + * ===== + * Messages are of two types. + * + * (1) The messages + * ERROR_INT(a,b,c) : returns l_int32 + * ERROR_FLOAT(a,b,c) : returns l_float32 + * ERROR_PTR(a,b,c) : returns void* + * are used to return from functions and take a fixed set of parameters: + * a :+ */ + +#ifdef NO_CONSOLE_IO + + #define PROCNAME(name) + #define ERROR_INT(a, b, c) ((l_int32)(c)) + #define ERROR_FLOAT(a, b, c) ((l_float32)(c)) + #define ERROR_PTR(a, b, c) ((void *)(c)) + #define L_ERROR(a, ...) + #define L_WARNING(a, ...) + #define L_INFO(a, ...) + +#else + + #define PROCNAME(name) static const char procName[] = name + #define IF_SEV(l, t, f) \ + ((l) >= MINIMUM_SEVERITY && (l) >= LeptMsgSeverity ? (t) : (f)) + + #define ERROR_INT(a, b, c) \ + IF_SEV(L_SEVERITY_ERROR, returnErrorInt((a), (b), (c)), (l_int32)(c)) + #define ERROR_FLOAT(a, b, c) \ + IF_SEV(L_SEVERITY_ERROR, returnErrorFloat((a), (b), (c)), (l_float32)(c)) + #define ERROR_PTR(a, b, c) \ + IF_SEV(L_SEVERITY_ERROR, returnErrorPtr((a), (b), (c)), (void *)(c)) + + #define L_ERROR(a, ...) \ + IF_SEV(L_SEVERITY_ERROR, \ + (void)lept_stderr("Error in %s: " a, __VA_ARGS__), \ + (void)0) + #define L_WARNING(a, ...) \ + IF_SEV(L_SEVERITY_WARNING, \ + (void)lept_stderr("Warning in %s: " a, __VA_ARGS__), \ + (void)0) + #define L_INFO(a, ...) \ + IF_SEV(L_SEVERITY_INFO, \ + (void)lept_stderr("Info in %s: " a, __VA_ARGS__), \ + (void)0) + +#if 0 /* Alternative method for controlling L_* message output */ + #define L_ERROR(a, ...) \ + { if (L_SEVERITY_ERROR >= MINIMUM_SEVERITY && \ + L_SEVERITY_ERROR >= LeptMsgSeverity) \ + lept_stderr("Error in %s: " a, __VA_ARGS__) \ + } + #define L_WARNING(a, ...) \ + { if (L_SEVERITY_WARNING >= MINIMUM_SEVERITY && \ + L_SEVERITY_WARNING >= LeptMsgSeverity) \ + lept_stderr("Warning in %s: " a, __VA_ARGS__) \ + } + #define L_INFO(a, ...) \ + { if (L_SEVERITY_INFO >= MINIMUM_SEVERITY && \ + L_SEVERITY_INFO >= LeptMsgSeverity) \ + lept_stderr("Info in %s: " a, __VA_ARGS__) \ + } +#endif + +#endif /* NO_CONSOLE_IO */ + + +/*------------------------------------------------------------------------* + * snprintf() renamed in MSVC (pre-VS2015) * + *------------------------------------------------------------------------*/ +#if defined _MSC_VER && _MSC_VER < 1900 +#define snprintf(buf, size, ...) _snprintf_s(buf, size, _TRUNCATE, __VA_ARGS__) +#endif + + +#endif /* LEPTONICA_ENVIRON_H */ diff --git a/third_party/leptonica/uos/amd64/include/leptonica/gplot.h b/third_party/leptonica/uos/amd64/include/leptonica/gplot.h new file mode 100644 index 00000000..d2e4f7e5 --- /dev/null +++ b/third_party/leptonica/uos/amd64/include/leptonica/gplot.h @@ -0,0 +1,96 @@ +/*====================================================================* + - Copyright (C) 2001 Leptonica. All rights reserved. + - + - Redistribution and use in source and binary forms, with or without + - modification, are permitted provided that the following conditions + - are met: + - 1. Redistributions of source code must retain the above copyright + - notice, this list of conditions and the following disclaimer. + - 2. Redistributions in binary form must reproduce the above + - copyright notice, this list of conditions and the following + - disclaimer in the documentation and/or other materials + - provided with the distribution. + - + - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ANY + - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *====================================================================*/ + +#ifndef LEPTONICA_GPLOT_H +#define LEPTONICA_GPLOT_H + +/*! + * \file gplot.h + * + *+ * b : procName + * c : + * where procName is the name of the local variable naming the function. + * + * (2) The purely informational L_* messages + * L_ERROR(a,...) + * L_WARNING(a,...) + * L_INFO(a,...) + * do not take a return value, but they take at least two parameters: + * a : with optional format conversions + * v1 : procName (this must be included as the first vararg) + * v2, ... : optional varargs to match format converters in the message + * + * To return an error from a function that returns void, use: + * L_ERROR( , procName, [...]) + * return; + * + * Implementation details + * ====================== + * Messages are defined with the IF_SEV macro. The first parameter is + * the message severity, the second is the function to call if the + * message is to be printed, and the third is the return value if the + * message is to be suppressed. For example, we might have an + * informational message defined as: + * + * IF_SEV(L_SEVERITY_INFO, fprintf(.......), 0) + * + * The macro expands into a conditional. Because the first comparison + * is between two constants, an optimizing compiler will remove either + * the comparison (if it's true) or the entire macro expansion (if it + * is false). This means that there is no run-time overhead for + * messages whose severity falls below the minimum specified at compile + * time, and for others the overhead is one (not two) comparisons. + * + * The L_nnn() macros below do not return a value, but because the + * conditional operator requires one for the false condition, we + * specify a void expression. + *
+ * Data structures and parameters for generating gnuplot files + * + * We used to support X11 output, but recent versions of gnuplot do not + * support the X11 terminal. To get display to your screen, use + * GPLOT_PNG output; e.g., + * gplotSimple1(na, GPLOT_PNG, "/tmp/someroot", ...); + * l_fileDisplay("/tmp/someroot.png", ...); + *+ */ + +#define GPLOT_VERSION_NUMBER 1 + +#define NUM_GPLOT_STYLES 5 +enum GPLOT_STYLE { + GPLOT_LINES = 0, + GPLOT_POINTS = 1, + GPLOT_IMPULSES = 2, + GPLOT_LINESPOINTS = 3, + GPLOT_DOTS = 4 +}; + +#define NUM_GPLOT_OUTPUTS 6 +enum GPLOT_OUTPUT { + GPLOT_NONE = 0, + GPLOT_PNG = 1, + GPLOT_PS = 2, + GPLOT_EPS = 3, + GPLOT_LATEX = 4, + GPLOT_PNM = 5, +}; + +enum GPLOT_SCALING { + GPLOT_LINEAR_SCALE = 0, /*!< default */ + GPLOT_LOG_SCALE_X = 1, + GPLOT_LOG_SCALE_Y = 2, + GPLOT_LOG_SCALE_X_Y = 3 +}; + +extern const char *gplotstylenames[]; /*!< used in gnuplot cmd file */ +extern const char *gplotfileoutputs[]; /*!< used in simple file input */ + +/*! Data structure for generating gnuplot files */ +struct GPlot +{ + char *rootname; /*!< for cmd, data, output */ + char *cmdname; /*!< command file name */ + struct Sarray *cmddata; /*!< command file contents */ + struct Sarray *datanames; /*!< data file names */ + struct Sarray *plotdata; /*!< plot data (1 string/file) */ + struct Sarray *plotlabels; /*!< label for each individual plot */ + struct Numa *plotstyles; /*!< plot style for individual plots */ + l_int32 nplots; /*!< current number of plots */ + char *outname; /*!< output file name */ + l_int32 outformat; /*!< GPLOT_OUTPUT values */ + l_int32 scaling; /*!< GPLOT_SCALING values */ + char *title; /*!< optional */ + char *xlabel; /*!< optional x axis label */ + char *ylabel; /*!< optional y axis label */ +}; +typedef struct GPlot GPLOT; + + +#endif /* LEPTONICA_GPLOT_H */ diff --git a/third_party/leptonica/uos/amd64/include/leptonica/hashmap.h b/third_party/leptonica/uos/amd64/include/leptonica/hashmap.h new file mode 100644 index 00000000..9674d362 --- /dev/null +++ b/third_party/leptonica/uos/amd64/include/leptonica/hashmap.h @@ -0,0 +1,134 @@ +/*====================================================================* + - Copyright (C) 2001 Leptonica. All rights reserved. + - + - Redistribution and use in source and binary forms, with or without + - modification, are permitted provided that the following conditions + - are met: + - 1. Redistributions of source code must retain the above copyright + - notice, this list of conditions and the following disclaimer. + - 2. Redistributions in binary form must reproduce the above + - copyright notice, this list of conditions and the following + - disclaimer in the documentation and/or other materials + - provided with the distribution. + - + - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ANY + - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *====================================================================*/ + +#ifndef LEPTONICA_HASHMAP_H +#define LEPTONICA_HASHMAP_H + +/* + * \file hashmap.h + * + *
+ * Contains the following structs: + * struct L_Hashmap + * struct L_Hashitem + * + * Goal: + * You have a set of objects (integers, strings, pts, whatever), + * and you want to store them in a data structure (L_Hashmap) that allows + * O(1) to find, insert and count the occurrences of such an object. + * The tool is a hash map. This is not ordered, unlike the O(log n) + * ordered map (L_Amap), which is implemented by an rbtree. + * + * In slightly more detail: + * Store the set of objects in an array, which in general can be + * held in a pointer array (L_Ptra). You need a hash function that + * will generate a unique uint64 key from each object. For our simple + * built-in arrays, such as float, double and Pta (points), these hash + * functions are in utils1.c. Then for each object in the array, + * you store the key and the index to the array of objects (the val) + * in a list of hashitems in the hash table, where the specific + * list is determined by the key (specifically, the mod of the key + * with the size of the hashtable). + * + * In yet more detail: + * (1) The design loosely follows the design of a hashmap in "The Practice + * of Programming by Brian Kernighan and Rob Pike, Addison Wesley, 1999. + * (2) The L_Hashmap contains a hashtable with a prime number of pointers + * to lists of hashitems. The lookup function takes a key and a value, + * which are both 64-bit unsigned integers. The key has been generated + * by hashing the input object in a way that avoids collisions between + * different objects. The value is an integer that identifies the + * object; typically it is the index into an array of objects. + * The hashtable size is a prime number, and an index into the table + * is made from the key by taking its mod with the hashtable size. + * The index points to a list of hashitems, which have all been hashed + * by the mod function into the same index in the table. + * Because the key is expected to be randomly distributed in uint64, + * the table indices should be uniformly distributed, resulting in + * approximately the same number of items being placed in each of + * these lists. The list of hashitems is traversed, comparing the + * input uint64 key in the lookup() function with the key stored in + * each hashitem. If a hashitem is found with a matching key, + * return a pointer to that hashitem. If not found and the op is + * L_HASH_CREATE, make a new hash item, add it to the list, and + * return a pointer to it. + * (3) The count field in the hashitem gives the number of times the + * key has been seen when storing key/value pairs. + * (4) The val field is the index into an array of the objects. When + * the hashmap is initially made, it is the index of the first item + * seen with its key. + * (5) For the hashmap to work efficiently, the lists must not become too + * long. Because in general you do not know the number of objects + * in advance, it is important to be able to dynamically resize + * the hashtable as it grows. The hashmap is initialized with + * room for some number of hashitems and the maximum average list + * size. These two numbers determine the size of the hashtable, + * which is constrained to be a prime number. As the hashtable grows, + * if the average occupancy exceeds the input %maxocc, the hashtable + * size is approximately doubled and the existing items are re-hashed + * into it, mod the new (prime number) table size. + *+ */ + +/*------------------------------------------------------------------------* + * Hash map structs * + *------------------------------------------------------------------------*/ +/*! General hash map */ +struct L_Hashmap +{ + l_int32 nitems; /*!< number of stored items */ + l_int32 ntogo; /*!< number of items to be stored */ + /*!< before resizing the hashmap */ + l_int32 maxocc; /*!< max average occupancy allowed */ + struct L_Hashitem **hashtab; /*!< array of hash item ptrs */ + l_int32 tabsize; /*!< size of array of hash item ptrs */ +}; +typedef struct L_Hashmap L_HASHMAP; + +/*! Hash item, containing storage for the key, value and count. The key + is a l_uint64, which is hashed by the mod function to find the index + into the hashtab. */ +struct L_Hashitem +{ + l_uint64 key; /*!< key is hashed into index into hashtab */ + l_uint64 val; /*!< number stored associated with the key */ + l_int32 count; /*!< number of elements seen with this key */ + struct L_Hashitem *next; /*!< ptr to the next in the list */ +}; +typedef struct L_Hashitem L_HASHITEM; + + +/*------------------------------------------------------------------------* + * Hashmap flags * + *------------------------------------------------------------------------*/ +/*! Hashmap Lookup */ +enum { + L_UNDEFINED = 0, /*!< invalid operation */ + L_HMAP_CHECK = 1, /*!< check if this key/val has been stored */ + L_HMAP_CREATE = 2 /*!< create and store a hashitem if not found */ +}; + +#endif /* LEPTONICA_HASHMAP_H */ diff --git a/third_party/leptonica/uos/amd64/include/leptonica/heap.h b/third_party/leptonica/uos/amd64/include/leptonica/heap.h new file mode 100644 index 00000000..d39b06b9 --- /dev/null +++ b/third_party/leptonica/uos/amd64/include/leptonica/heap.h @@ -0,0 +1,87 @@ +/*====================================================================* + - Copyright (C) 2001 Leptonica. All rights reserved. + - + - Redistribution and use in source and binary forms, with or without + - modification, are permitted provided that the following conditions + - are met: + - 1. Redistributions of source code must retain the above copyright + - notice, this list of conditions and the following disclaimer. + - 2. Redistributions in binary form must reproduce the above + - copyright notice, this list of conditions and the following + - disclaimer in the documentation and/or other materials + - provided with the distribution. + - + - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ANY + - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *====================================================================*/ + +#ifndef LEPTONICA_HEAP_H +#define LEPTONICA_HEAP_H + +/*! + * \file heap.h + * + *
+ * Expandable priority queue configured as a heap for arbitrary void* data + * + * The L_Heap is used to implement a priority queue. The elements + * in the heap are ordered in either increasing or decreasing key value. + * The key is a float field 'keyval' that is required to be + * contained in the elements of the queue. + * + * The heap is a simple binary tree with the following constraints: + * - the key of each node is >= the keys of the two children + * - the tree is complete, meaning that each level (1, 2, 4, ...) + * is filled and the last level is filled from left to right + * + * The tree structure is implicit in the queue array, with the + * array elements numbered as a breadth-first search of the tree + * from left to right. It is thus guaranteed that the largest + * (or smallest) key belongs to the first element in the array. + * + * Heap sort is used to sort the array. Once an array has been + * sorted as a heap, it is convenient to use it as a priority queue, + * because the min (or max) elements are always at the root of + * the tree (element 0), and once removed, the heap can be + * resorted in not more than log[n] steps, where n is the number + * of elements on the heap. Likewise, if an arbitrary element is + * added to the end of the array A, the sorted heap can be restored + * in not more than log[n] steps. + * + * A L_Heap differs from a L_Queue in that the elements in the former + * are sorted by a key. Internally, the array is maintained + * as a queue, with a pointer to the end of the array. The + * head of the array always remains at array[0]. The array is + * maintained (sorted) as a heap. When an item is removed from + * the head, the last item takes its place (thus reducing the + * array length by 1), and this is followed by array element + * swaps to restore the heap property. When an item is added, + * it goes at the end of the array, and is swapped up to restore + * the heap. If the ptr array is full, adding another item causes + * the ptr array size to double. + * + * For further implementation details, see heap.c. + *+ */ + +/*! Heap of arbitrary void* data */ +struct L_Heap +{ + l_int32 nalloc; /*!< size of allocated ptr array */ + l_int32 n; /*!< number of elements stored in the heap */ + void **array; /*!< ptr array */ + l_int32 direction; /*!< L_SORT_INCREASING or L_SORT_DECREASING */ +}; +typedef struct L_Heap L_HEAP; + + +#endif /* LEPTONICA_HEAP_H */ diff --git a/third_party/leptonica/uos/amd64/include/leptonica/imageio.h b/third_party/leptonica/uos/amd64/include/leptonica/imageio.h new file mode 100644 index 00000000..d2362fe7 --- /dev/null +++ b/third_party/leptonica/uos/amd64/include/leptonica/imageio.h @@ -0,0 +1,250 @@ +/*====================================================================* + - Copyright (C) 2001 Leptonica. All rights reserved. + - + - Redistribution and use in source and binary forms, with or without + - modification, are permitted provided that the following conditions + - are met: + - 1. Redistributions of source code must retain the above copyright + - notice, this list of conditions and the following disclaimer. + - 2. Redistributions in binary form must reproduce the above + - copyright notice, this list of conditions and the following + - disclaimer in the documentation and/or other materials + - provided with the distribution. + - + - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ANY + - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *====================================================================*/ + +/*! + * \file imageio.h + * + *
+ * General features of image I/O in leptonica + * + * At present, there are 9 file formats for images that can be read + * and written: + * png (requires libpng, libz) + * jpeg (requires libjpeg) + * tiff (requires libtiff, libz) + * gif (requires libgif) + * webp (requires libwebp) + * jp2 (requires libopenjp2) + * bmp (no library required) + * pnm (no library required) + * spix (no library required) + * Additionally, there are two file formats for writing (only) images: + * PostScript (requires libpng, libz, libjpeg, libtiff) + * pdf (requires libpng, libz, libjpeg, libtiff) + * + * For all 9 read/write formats, leptonica provides interconversion + * between pix (with raster data) and formatted image data: + * Conversion from pix (typically compression): + * pixWrite(): pix --> file + * pixWriteStream(): pix --> filestream (aka FILE*) + * pixWriteMem(): pix --> memory buffer + * Conversion to pix (typically decompression): + * pixRead(): file --> pix + * pixReadStream(): filestream --> pix + * pixReadMem(): memory buffer --> pix + * + * Conversions for which the image data is not compressed are: + * * uncompressed tiff (IFF_TIFF) + * * bmp + * * pnm + * * spix (fast serialization that copies the pix raster data) + * + * The image header (metadata) information can be read from either + * the compressed file or a memory buffer, for all 9 formats. + *+ */ + +#ifndef LEPTONICA_IMAGEIO_H +#define LEPTONICA_IMAGEIO_H + +/* --------------------------------------------------------------- * + * Image file format types * + * --------------------------------------------------------------- */ +/* + * The IFF_DEFAULT flag is used to write the file out in the + * same (input) file format that the pix was read from. If the pix + * was not read from file, the input format field will be + * IFF_UNKNOWN and the output file format will be chosen to + * be compressed and lossless; namely, IFF_TIFF_G4 for d = 1 + * and IFF_PNG for everything else. + * + * In the future, new format types that have defined extensions + * will be added before IFF_DEFAULT, and will be kept in sync with + * the file format extensions in writefile.c. The positions of + * file formats before IFF_DEFAULT will remain invariant. + */ + +/*! Image Formats */ +enum { + IFF_UNKNOWN = 0, + IFF_BMP = 1, + IFF_JFIF_JPEG = 2, + IFF_PNG = 3, + IFF_TIFF = 4, + IFF_TIFF_PACKBITS = 5, + IFF_TIFF_RLE = 6, + IFF_TIFF_G3 = 7, + IFF_TIFF_G4 = 8, + IFF_TIFF_LZW = 9, + IFF_TIFF_ZIP = 10, + IFF_PNM = 11, + IFF_PS = 12, + IFF_GIF = 13, + IFF_JP2 = 14, + IFF_WEBP = 15, + IFF_LPDF = 16, + IFF_TIFF_JPEG = 17, + IFF_DEFAULT = 18, + IFF_SPIX = 19 +}; + +/* Convenient macro for checking requested tiff output */ +#define L_FORMAT_IS_TIFF(f) ((f) == IFF_TIFF || (f) == IFF_TIFF_PACKBITS || \ + (f) == IFF_TIFF_RLE || (f) == IFF_TIFF_G3 || \ + (f) == IFF_TIFF_G4 || (f) == IFF_TIFF_LZW || \ + (f) == IFF_TIFF_ZIP || (f) == IFF_TIFF_JPEG) + + +/* --------------------------------------------------------------- * + * Format header ids * + * --------------------------------------------------------------- */ +/*! Header Ids */ +enum { + BMP_ID = 0x4d42, /*!< BM - for bitmaps */ + TIFF_BIGEND_ID = 0x4d4d, /*!< MM - for 'motorola' */ + TIFF_LITTLEEND_ID = 0x4949 /*!< II - for 'intel' */ +}; + + +/* --------------------------------------------------------------- * + * Hinting bit flags in jpeg reader * + * --------------------------------------------------------------- */ +/*! Jpeg Hints */ +/* The default behavior is now to fail on data corruption. */ +enum { + L_JPEG_READ_LUMINANCE = 1, /*!< only want luminance data; no chroma */ + L_JPEG_CONTINUE_WITH_BAD_DATA = 2 /*!< return possibly damaged pix */ +}; + + +/* --------------------------------------------------------------- * + * Jp2k codecs * + * --------------------------------------------------------------- */ +/*! Jp2k Codecs */ +enum { + L_J2K_CODEC = 1, /*!< codestream */ + L_JP2_CODEC = 2 /*!< file format with 'ihdr' */ +}; + + +/* --------------------------------------------------------------- * + * Pdf formatted encoding types * + * --------------------------------------------------------------- */ +/*! Pdf Encoding */ +enum { + L_DEFAULT_ENCODE = 0, /*!< use default encoding based on image */ + L_JPEG_ENCODE = 1, /*!< use dct encoding: 8 and 32 bpp, no cmap */ + L_G4_ENCODE = 2, /*!< use ccitt g4 fax encoding: 1 bpp */ + L_FLATE_ENCODE = 3, /*!< use flate encoding: any depth, cmap ok */ + L_JP2K_ENCODE = 4 /*!< use jp2k encoding: 8 and 32 bpp, no cmap */ +}; + + +/* --------------------------------------------------------------- * + * Compressed image data * + * --------------------------------------------------------------- */ +/* + * In use, either datacomp or data85 will be produced, depending + * on whether the data needs to be ascii85 encoded. PostScript + * requires ascii85 encoding; pdf does not. + * + * For the colormap (flate compression only), PostScript uses ascii85 + * encoding and pdf uses a bracketed array of space-separated + * hex-encoded rgb triples. Only tiff g4 (type == L_G4_ENCODE) uses + * the minisblack field. + */ + +/*! Compressed image data */ +struct L_Compressed_Data +{ + l_int32 type; /*!< encoding type: L_JPEG_ENCODE, etc */ + l_uint8 *datacomp; /*!< gzipped raster data */ + size_t nbytescomp; /*!< number of compressed bytes */ + char *data85; /*!< ascii85-encoded gzipped raster data */ + size_t nbytes85; /*!< number of ascii85 encoded bytes */ + char *cmapdata85; /*!< ascii85-encoded uncompressed cmap */ + char *cmapdatahex; /*!< hex pdf array for the cmap */ + l_int32 ncolors; /*!< number of colors in cmap */ + l_int32 w; /*!< image width */ + l_int32 h; /*!< image height */ + l_int32 bps; /*!< bits/sample; typ. 1, 2, 4 or 8 */ + l_int32 spp; /*!< samples/pixel; typ. 1 or 3 */ + l_int32 minisblack; /*!< tiff g4 photometry */ + l_int32 predictor; /*!< flate data has PNG predictors */ + size_t nbytes; /*!< number of uncompressed raster bytes */ + l_int32 res; /*!< resolution (ppi) */ +}; +typedef struct L_Compressed_Data L_COMP_DATA; + + +/* ------------------------------------------------------------------------- * + * Pdf multi image flags * + * ------------------------------------------------------------------------- */ +/*! Pdf MultiImage */ +enum { + L_FIRST_IMAGE = 1, /*!< first image to be used */ + L_NEXT_IMAGE = 2, /*!< intermediate image; not first or last */ + L_LAST_IMAGE = 3 /*!< last image to be used */ +}; + + +/* ------------------------------------------------------------------------- * + * Intermediate pdf generation data * + * ------------------------------------------------------------------------- */ +/* + * This accumulates data for generating a pdf of a single page consisting + * of an arbitrary number of images. + * + * None of the strings have a trailing newline. + */ + +/*! Intermediate pdf generation data */ +struct L_Pdf_Data +{ + char *title; /*!< optional title for pdf */ + l_int32 n; /*!< number of images */ + l_int32 ncmap; /*!< number of colormaps */ + struct L_Ptra *cida; /*!< array of compressed image data */ + char *id; /*!< %PDF-1.2 id string */ + char *obj1; /*!< catalog string */ + char *obj2; /*!< metadata string */ + char *obj3; /*!< pages string */ + char *obj4; /*!< page string (variable data) */ + char *obj5; /*!< content string (variable data) */ + char *poststream; /*!< post-binary-stream string */ + char *trailer; /*!< trailer string (variable data) */ + struct Pta *xy; /*!< store (xpt, ypt) array */ + struct Pta *wh; /*!< store (wpt, hpt) array */ + struct Box *mediabox; /*!< bounding region for all images */ + struct Sarray *saprex; /*!< pre-binary-stream xobject strings */ + struct Sarray *sacmap; /*!< colormap pdf object strings */ + struct L_Dna *objsize; /*!< sizes of each pdf string object */ + struct L_Dna *objloc; /*!< location of each pdf string object */ + l_int32 xrefloc; /*!< location of xref */ +}; +typedef struct L_Pdf_Data L_PDF_DATA; + +#endif /* LEPTONICA_IMAGEIO_H */ diff --git a/third_party/leptonica/uos/amd64/include/leptonica/jbclass.h b/third_party/leptonica/uos/amd64/include/leptonica/jbclass.h new file mode 100644 index 00000000..62aad60a --- /dev/null +++ b/third_party/leptonica/uos/amd64/include/leptonica/jbclass.h @@ -0,0 +1,142 @@ +/*====================================================================* + - Copyright (C) 2001 Leptonica. All rights reserved. + - + - Redistribution and use in source and binary forms, with or without + - modification, are permitted provided that the following conditions + - are met: + - 1. Redistributions of source code must retain the above copyright + - notice, this list of conditions and the following disclaimer. + - 2. Redistributions in binary form must reproduce the above + - copyright notice, this list of conditions and the following + - disclaimer in the documentation and/or other materials + - provided with the distribution. + - + - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ANY + - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *====================================================================*/ + +#ifndef LEPTONICA_JBCLASS_H +#define LEPTONICA_JBCLASS_H + +/*! + * \file jbclass.h + * + * JbClasser + * JbData + */ + + + /*! + *
+ * The JbClasser struct holds all the data accumulated during the + * classification process that can be used for a compressed + * jbig2-type representation of a set of images. This is created + * in an initialization process and added to as the selected components + * on each successive page are analyzed. + *+ */ +struct JbClasser +{ + struct Sarray *safiles; /*!< input page image file names */ + l_int32 method; /*!< JB_RANKHAUS, JB_CORRELATION */ + l_int32 components; /*!< JB_CONN_COMPS, JB_CHARACTERS or */ + /*!< JB_WORDS */ + l_int32 maxwidth; /*!< max component width allowed */ + l_int32 maxheight; /*!< max component height allowed */ + l_int32 npages; /*!< number of pages already processed */ + l_int32 baseindex; /*!< number components already processed */ + /*!< on fully processed pages */ + struct Numa *nacomps; /*!< number of components on each page */ + l_int32 sizehaus; /*!< size of square struct elem for haus */ + l_float32 rankhaus; /*!< rank val of haus match, each way */ + l_float32 thresh; /*!< thresh value for correlation score */ + l_float32 weightfactor; /*!< corrects thresh value for heaver */ + /*!< components; use 0 for no correction */ + struct Numa *naarea; /*!< w * h of each template, without */ + /*!< extra border pixels */ + l_int32 w; /*!< max width of original src images */ + l_int32 h; /*!< max height of original src images */ + l_int32 nclass; /*!< current number of classes */ + l_int32 keep_pixaa; /*!< If zero, pixaa isn't filled */ + struct Pixaa *pixaa; /*!< instances for each class; unbordered */ + struct Pixa *pixat; /*!< templates for each class; bordered */ + /*!< and not dilated */ + struct Pixa *pixatd; /*!< templates for each class; bordered */ + /*!< and dilated */ + struct L_DnaHash *dahash; /*!< Hash table to find templates by size */ + struct Numa *nafgt; /*!< fg areas of undilated templates; */ + /*!< only used for rank < 1.0 */ + struct Pta *ptac; /*!< centroids of all bordered cc */ + struct Pta *ptact; /*!< centroids of all bordered template cc */ + struct Numa *naclass; /*!< array of class ids for each component */ + struct Numa *napage; /*!< array of page nums for each component */ + struct Pta *ptaul; /*!< array of UL corners at which the */ + /*!< template is to be placed for each */ + /*!< component */ + struct Pta *ptall; /*!< similar to ptaul, but for LL corners */ +}; +typedef struct JbClasser JBCLASSER; + + + /*! + *
+ * The JbData struct holds all the data required for + * the compressed jbig-type representation of a set of images. + * The data can be written to file, read back, and used + * to regenerate an approximate version of the original, + * which differs in two ways from the original: + * (1) It uses a template image for each c.c. instead of the + * original instance, for each occurrence on each page. + * (2) It discards components with either a height or width larger + * than the maximuma, given here by the lattice dimensions + * used for storing the templates. + *+ */ +struct JbData +{ + struct Pix *pix; /*!< template composite for all classes */ + l_int32 npages; /*!< number of pages */ + l_int32 w; /*!< max width of original page images */ + l_int32 h; /*!< max height of original page images */ + l_int32 nclass; /*!< number of classes */ + l_int32 latticew; /*!< lattice width for template composite */ + l_int32 latticeh; /*!< lattice height for template composite */ + struct Numa *naclass; /*!< array of class ids for each component */ + struct Numa *napage; /*!< array of page nums for each component */ + struct Pta *ptaul; /*!< array of UL corners at which the */ + /*!< template is to be placed for each */ + /*!< component */ +}; +typedef struct JbData JBDATA; + + +/*! JB Classifier */ +enum { + JB_RANKHAUS = 0, + JB_CORRELATION = 1 +}; + + /*! For jbGetComponents(): type of component to extract from images */ +/*! JB Component */ +enum { + JB_CONN_COMPS = 0, + JB_CHARACTERS = 1, + JB_WORDS = 2 +}; + + /*! These parameters are used for naming the two files + * in which the jbig2-like compressed data is stored. */ +#define JB_TEMPLATE_EXT ".templates.png" +#define JB_DATA_EXT ".data" + + +#endif /* LEPTONICA_JBCLASS_H */ diff --git a/third_party/leptonica/uos/amd64/include/leptonica/leptwin.h b/third_party/leptonica/uos/amd64/include/leptonica/leptwin.h new file mode 100644 index 00000000..451da6b6 --- /dev/null +++ b/third_party/leptonica/uos/amd64/include/leptonica/leptwin.h @@ -0,0 +1,45 @@ +/*====================================================================* + - Copyright (C) 2001 Leptonica. All rights reserved. + - + - Redistribution and use in source and binary forms, with or without + - modification, are permitted provided that the following conditions + - are met: + - 1. Redistributions of source code must retain the above copyright + - notice, this list of conditions and the following disclaimer. + - 2. Redistributions in binary form must reproduce the above + - copyright notice, this list of conditions and the following + - disclaimer in the documentation and/or other materials + - provided with the distribution. + - + - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ANY + - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *====================================================================*/ + +#ifdef _WIN32 +#ifndef LEPTONICA_LEPTWIN_H +#define LEPTONICA_LEPTWIN_H + +#include "allheaders.h" +#include
+ * Cell for double-linked lists + * + * This allows composition of a list of cells with + * prev, next and data pointers. Generic data + * structures hang on the list cell data pointers. + * + * The list is not circular because that would add much + * complexity in traversing the list under general + * conditions where list cells can be added and removed. + * The only disadvantage of not having the head point to + * the last cell is that the list must be traversed to + * find its tail. However, this traversal is fast, and + * the listRemoveFromTail() function updates the tail + * so there is no searching overhead with repeated use. + * + * The list macros are used to run through a list, and their + * use is encouraged. They are invoked, e.g., as + * + * DLLIST *head, *elem; + * ... + * L_BEGIN_LIST_FORWARD(head, elem) + *+ */ + +struct DoubleLinkedList +{ + struct DoubleLinkedList *prev; + struct DoubleLinkedList *next; + void *data; +}; +typedef struct DoubleLinkedList DLLIST; + + + /*! Simple list traverse macro - forward */ +#define L_BEGIN_LIST_FORWARD(head, element) \ + { \ + DLLIST *_leptvar_nextelem_; \ + for ((element) = (head); (element); (element) = _leptvar_nextelem_) { \ + _leptvar_nextelem_ = (element)->next; + + + /*! Simple list traverse macro - reverse */ +#define L_BEGIN_LIST_REVERSE(tail, element) \ + { \ + DLLIST *_leptvar_prevelem_; \ + for ((element) = (tail); (element); (element) = _leptvar_prevelem_) { \ + _leptvar_prevelem_ = (element)->prev; + + + /*! Simple list traverse macro - end of a list traverse */ +#define L_END_LIST }} + + +#endif /* LEPTONICA_LIST_H */ diff --git a/third_party/leptonica/uos/amd64/include/leptonica/morph.h b/third_party/leptonica/uos/amd64/include/leptonica/morph.h new file mode 100644 index 00000000..34f665fc --- /dev/null +++ b/third_party/leptonica/uos/amd64/include/leptonica/morph.h @@ -0,0 +1,225 @@ +/*====================================================================* + - Copyright (C) 2001 Leptonica. All rights reserved. + - + - Redistribution and use in source and binary forms, with or without + - modification, are permitted provided that the following conditions + - are met: + - 1. Redistributions of source code must retain the above copyright + - notice, this list of conditions and the following disclaimer. + - 2. Redistributions in binary form must reproduce the above + - copyright notice, this list of conditions and the following + - disclaimer in the documentation and/or other materials + - provided with the distribution. + - + - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ANY + - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *====================================================================*/ + +#ifndef LEPTONICA_MORPH_H +#define LEPTONICA_MORPH_H + +/*! + * \file morph.h + * + *data > + * L_END_LIST + *
+ * Contains the following structs: + * struct Sel + * struct Sela + * struct Kernel + * + * Contains definitions for: + * morphological b.c. flags + * structuring element types + * runlength flags for granulometry + * direction flags for grayscale morphology + * morphological operation flags + * standard border size + * grayscale intensity scaling flags + * morphological tophat flags + * arithmetic and logical operator flags + * grayscale morphology selection flags + * distance function b.c. flags + * image comparison flags + *+ */ + +/*-------------------------------------------------------------------------* + * Sel and Sel array * + *-------------------------------------------------------------------------*/ +#define SEL_VERSION_NUMBER 1 + +/*! 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; + +/*! Array of Sel */ +struct Sela +{ + l_int32 n; /*!< number of sel actually stored */ + l_int32 nalloc; /*!< size of allocated ptr array */ + struct Sel **sel; /*!< sel ptr array */ +}; +typedef struct Sela SELA; + + +/*-------------------------------------------------------------------------* + * Kernel * + *-------------------------------------------------------------------------*/ +#define KERNEL_VERSION_NUMBER 2 + +/*! Kernel */ +struct L_Kernel +{ + l_int32 sy; /*!< kernel height */ + l_int32 sx; /*!< kernel width */ + l_int32 cy; /*!< y location of kernel origin */ + l_int32 cx; /*!< x location of kernel origin */ + l_float32 **data; /*!< data[i][j] in [row][col] order */ +}; +typedef struct L_Kernel L_KERNEL; + + +/*-------------------------------------------------------------------------* + * Morphological boundary condition flags * + * * + * Two types of boundary condition for erosion. * + * The global variable MORPH_BC takes on one of these two values. * + * See notes in morph.c for usage. * + *-------------------------------------------------------------------------*/ +/*! Morph Boundary */ +enum { + SYMMETRIC_MORPH_BC = 0, + ASYMMETRIC_MORPH_BC = 1 +}; + +/*-------------------------------------------------------------------------* + * Structuring element vals * + *-------------------------------------------------------------------------*/ +/*! SEL Vals */ +enum { + SEL_DONT_CARE = 0, + SEL_HIT = 1, + SEL_MISS = 2 +}; + +/*-------------------------------------------------------------------------* + * Runlength flags for granulometry * + *-------------------------------------------------------------------------*/ +/*! Runlength Polarity */ +enum { + L_RUN_OFF = 0, + L_RUN_ON = 1 +}; + +/*-------------------------------------------------------------------------* + * Direction flags for grayscale morphology, granulometry, * + * composable Sels, convolution, etc. * + *-------------------------------------------------------------------------*/ +/*! Direction Flags */ +enum { + L_HORIZ = 1, + L_VERT = 2, + L_BOTH_DIRECTIONS = 3 +}; + +/*-------------------------------------------------------------------------* + * Morphological operation flags * + *-------------------------------------------------------------------------*/ +/*! Morph Operator */ +enum { + L_MORPH_DILATE = 1, + L_MORPH_ERODE = 2, + L_MORPH_OPEN = 3, + L_MORPH_CLOSE = 4, + L_MORPH_HMT = 5 +}; + +/*-------------------------------------------------------------------------* + * Grayscale intensity scaling flags * + *-------------------------------------------------------------------------*/ +/*! Pixel Value Scaling */ +enum { + L_LINEAR_SCALE = 1, + L_LOG_SCALE = 2 +}; + +/*-------------------------------------------------------------------------* + * Morphological tophat flags * + *-------------------------------------------------------------------------*/ +/*! Morph Tophat */ +enum { + L_TOPHAT_WHITE = 0, + L_TOPHAT_BLACK = 1 +}; + +/*-------------------------------------------------------------------------* + * Arithmetic and logical operator flags * + * (use on grayscale images and Numas) * + *-------------------------------------------------------------------------*/ +/*! ArithLogical Ops */ +enum { + L_ARITH_ADD = 1, + L_ARITH_SUBTRACT = 2, + L_ARITH_MULTIPLY = 3, /* on numas only */ + L_ARITH_DIVIDE = 4, /* on numas only */ + L_UNION = 5, /* on numas only */ + L_INTERSECTION = 6, /* on numas only */ + L_SUBTRACTION = 7, /* on numas only */ + L_EXCLUSIVE_OR = 8 /* on numas only */ +}; + +/*-------------------------------------------------------------------------* + * Min/max selection flags * + *-------------------------------------------------------------------------*/ +/*! MinMax Selection */ +enum { + L_CHOOSE_MIN = 1, /* useful in a downscaling "erosion" */ + L_CHOOSE_MAX = 2, /* useful in a downscaling "dilation" */ + L_CHOOSE_MAXDIFF = 3, /* useful in a downscaling contrast */ + L_CHOOSE_MIN_BOOST = 4, /* use a modification of the min value */ + L_CHOOSE_MAX_BOOST = 5 /* use a modification of the max value */ +}; + +/*-------------------------------------------------------------------------* + * Exterior value b.c. for distance function flags * + *-------------------------------------------------------------------------*/ +/*! Exterior Value */ +enum { + L_BOUNDARY_BG = 1, /* assume bg outside image */ + L_BOUNDARY_FG = 2 /* assume fg outside image */ +}; + +/*-------------------------------------------------------------------------* + * Image comparison flags * + *-------------------------------------------------------------------------*/ +/*! Image Comparison */ +enum { + L_COMPARE_XOR = 1, + L_COMPARE_SUBTRACT = 2, + L_COMPARE_ABS_DIFF = 3 +}; + +/*-------------------------------------------------------------------------* + * Standard size of border added around images for special processing * + *-------------------------------------------------------------------------*/ +static const l_int32 ADDED_BORDER = 32; /*!< pixels, not bits */ + + +#endif /* LEPTONICA_MORPH_H */ diff --git a/third_party/leptonica/uos/amd64/include/leptonica/pix.h b/third_party/leptonica/uos/amd64/include/leptonica/pix.h new file mode 100644 index 00000000..a2fe8e1a --- /dev/null +++ b/third_party/leptonica/uos/amd64/include/leptonica/pix.h @@ -0,0 +1,1094 @@ +/*====================================================================* + - Copyright (C) 2001 Leptonica. All rights reserved. + - + - Redistribution and use in source and binary forms, with or without + - modification, are permitted provided that the following conditions + - are met: + - 1. Redistributions of source code must retain the above copyright + - notice, this list of conditions and the following disclaimer. + - 2. Redistributions in binary form must reproduce the above + - copyright notice, this list of conditions and the following + - disclaimer in the documentation and/or other materials + - provided with the distribution. + - + - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ANY + - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *====================================================================*/ + +#ifndef LEPTONICA_PIX_H +#define LEPTONICA_PIX_H + +/*! + * \file pix.h + * + *
+ * Valid image types in leptonica: + * Pix: 1 bpp, with and without colormap + * Pix: 2 bpp, with and without colormap + * Pix: 4 bpp, with and without colormap + * Pix: 8 bpp, with and without colormap + * Pix: 16 bpp (1 spp) + * Pix: 32 bpp (rgb, 3 spp) + * Pix: 32 bpp (rgba, 4 spp) + * FPix: 32 bpp float + * DPix: 64 bpp double + * Notes: + * (1) The only valid Pix image type with alpha is rgba. + * In particular, the alpha component is not used in + * cmapped images. + * (2) PixComp can hold any Pix with IFF_PNG encoding. + * + * Contents: + * + * (1) This file has typedefs for most of the image-related structs + * used in leptonica: + * struct Pix + * struct PixColormap + * struct RGBA_Quad + * struct Pixa + * struct Pixaa + * struct Box + * struct Boxa + * struct Boxaa + * struct Pta + * struct Ptaa + * struct Pixacc + * struct PixTiling + * struct FPix + * struct FPixa + * struct DPix + * struct PixComp + * struct PixaComp + * + * (2) This file has definitions for: + * Colors for RGBA + * Colors for drawing boxes + * Perceptual color weights + * Colormap conversion flags + * Rasterop bit flags + * Structure access flags (for insert, copy, clone, copy-clone) + * Sorting flags (by type and direction) + * Blending flags + * Graphics pixel setting flags + * Size and location filter flags + * Color component selection flags + * Color content flags + * 16-bit conversion flags + * Rotation and shear flags + * Affine transform order flags + * Grayscale filling flags + * Flags for setting to white or black + * Flags for getting white or black pixel value + * Flags for 8 and 16 bit pixel sums + * Dithering flags + * Distance flags + * Value flags + * Statistical measures + * Set selection flags + * Text orientation flags + * Edge orientation flags + * Line orientation flags + * Image orientation flags + * Scan direction flags + * Box size adjustment flags + * Flags for modifying box boundaries using a second box + * Handling overlapping bounding boxes in boxa + * Selecting or making a box from two (intersecting) boxes + * Flags for replacing invalid boxes + * Flags for box corners and center + * Horizontal warp + * Pixel selection for resampling + * Thinning flags + * Runlength flags + * Edge filter flags + * Subpixel color component ordering in LCD display + * HSV histogram flags + * Region flags (inclusion, exclusion) + * Flags for adding text to a pix + * Flags for plotting on a pix + * Flags for making simple masks + * Flags for selecting display program + * Flags in the 'special' pix field for non-default operations + * Handling negative values in conversion to unsigned int + * Relative to zero flags + * Flags for adding or removing trailing slash from string + * + * (3) This file has typedefs for the pix allocator and deallocator functions + * alloc_fn() + * dealloc_fn(). + * + * ------------------------------------------------------------------- + * Notes on the pixels in the raster image. This information can also + * be found in pix_internal.h. + * + * (1) The image data is stored in a single contiguous + * array of l_uint32, into which the pixels are packed. + * By "packed" we mean that there are no unused bits + * between pixels, except for end-of-line padding to + * satisfy item (2) below. + * + * (2) Every image raster line begins on a 32-bit word + * boundary within this array. + * + * (3) Pix image data is stored in 32-bit units, with the + * pixels ordered from left to right in the image being + * stored in order from the MSB to LSB within the word, + * for both big-endian and little-endian machines. + * This is the natural ordering for big-endian machines, + * as successive bytes are stored and fetched progressively + * to the right. However, for little-endians, when storing + * we re-order the bytes from this byte stream order, and + * reshuffle again for byte access on 32-bit entities. + * So if the bytes come in sequence from left to right, we + * store them on little-endians in byte order: + * 3 2 1 0 7 6 5 4 ... + * This MSB to LSB ordering allows left and right shift + * operations on 32 bit words to move the pixels properly. + * + * (4) We use 32 bit pixels for both RGB and RGBA color images. + * The A (alpha) byte is ignored in most leptonica functions + * operating on color images. Within each 4 byte pixel, the + * color samples are ordered from MSB to LSB, as follows: + * + * | MSB | 2nd MSB | 3rd MSB | LSB | + * red green blue alpha + * 0 1 2 3 (big-endian) + * 3 2 1 0 (little-endian) + * + * Because we use MSB to LSB ordering within the 32-bit word, + * the individual 8-bit samples can be accessed with + * GET_DATA_BYTE and SET_DATA_BYTE macros, using the + * (implicitly big-ending) ordering + * red: byte 0 (MSB) + * green: byte 1 (2nd MSB) + * blue: byte 2 (3rd MSB) + * alpha: byte 3 (LSB) + * + * The specific color assignment is made in this file, + * through the definitions of COLOR_RED, etc. Then the R, G + * B and A sample values can be retrieved using + * redval = GET_DATA_BYTE(&pixel, COLOR_RED); + * greenval = GET_DATA_BYTE(&pixel, COLOR_GREEN); + * blueval = GET_DATA_BYTE(&pixel, COLOR_BLUE); + * alphaval = GET_DATA_BYTE(&pixel, L_ALPHA_CHANNEL); + * and they can be set with + * SET_DATA_BYTE(&pixel, COLOR_RED, redval); + * SET_DATA_BYTE(&pixel, COLOR_GREEN, greenval); + * SET_DATA_BYTE(&pixel, COLOR_BLUE, blueval); + * SET_DATA_BYTE(&pixel, L_ALPHA_CHANNEL, alphaval); + * + * More efficiently, these components can be extracted directly + * by shifting and masking, explicitly using the values in + * L_RED_SHIFT, etc.: + * (pixel32 >> L_RED_SHIFT) & 0xff; (red) + * (pixel32 >> L_GREEN_SHIFT) & 0xff; (green) + * (pixel32 >> L_BLUE_SHIFT) & 0xff; (blue) + * (pixel32 >> L_ALPHA_SHIFT) & 0xff; (alpha) + * The functions extractRGBValues() and extractRGBAValues() are + * provided to do this. Likewise, the pixels can be set + * directly by shifting, using composeRGBPixel() and + * composeRGBAPixel(). + * + * All these operations work properly on both big- and little-endians. + * + * (5) A reference count is held within each pix, giving the + * number of ptrs to the pix. When a pixClone() call + * is made, the ref count is increased by 1, and + * when a pixDestroy() call is made, the reference count + * of the pix is decremented. The pix is only destroyed + * when the reference count goes to zero. + * + * (6) Version numbers are used in the serialization of image-related + * data structures. They are placed in the files, and rarely + * (if ever) change. + * + * (7) The serialization dependencies are as follows: + * pixaa : pixa : boxa + * boxaa : boxa + * So, for example, pixaa and boxaa can be changed without + * forcing a change in pixa or boxa. However, if pixa is + * changed, it forces a change in pixaa, and if boxa is + * changed, if forces a change in the other three. + *+ */ + +/*-------------------------------------------------------------------------* + * Basic Pix * + *-------------------------------------------------------------------------*/ +/*! Basic Pix */ +typedef struct Pix PIX; + +/*! Colormap of a Pix */ +typedef struct PixColormap PIXCMAP; + + /*! Colormap table entry (after the BMP version). + * Note that the BMP format stores the colormap table exactly + * as it appears here, with color samples being stored sequentially, + * in the order (b,g,r,a). */ +typedef struct RGBA_Quad RGBA_QUAD; + +/*-------------------------------------------------------------------------* + * Pix arrays * + *-------------------------------------------------------------------------*/ +/*! Array of pix */ +typedef struct Pixa PIXA; + +/*! Array of arrays of pix */ +typedef struct Pixaa PIXAA; + +/*-------------------------------------------------------------------------* + * Basic rectangle and rectangle arrays * + *-------------------------------------------------------------------------*/ +/*! Basic rectangle */ +typedef struct Box BOX; + +/*! Array of Box */ +typedef struct Boxa BOXA; + +/*! Array of Boxa */ +typedef struct Boxaa BOXAA; + +/*-------------------------------------------------------------------------* + * Arrays of points * + *-------------------------------------------------------------------------*/ +/*! Array of points */ +typedef struct Pta PTA; + +/*! Array of Pta */ +typedef struct Ptaa PTAA; + +/*-------------------------------------------------------------------------* + * Pix accumulator container * + *-------------------------------------------------------------------------*/ +/*! Pix accumulator container */ +typedef struct Pixacc PIXACC; + +/*-------------------------------------------------------------------------* + * Pix tiling * + *-------------------------------------------------------------------------*/ +/*! Pix tiling */ +typedef struct PixTiling PIXTILING; + +/*-------------------------------------------------------------------------* + * FPix: pix with float array * + *-------------------------------------------------------------------------*/ +/*! Pix with float array */ +typedef struct FPix FPIX; + +/*! Array of FPix */ +typedef struct FPixa FPIXA; + +/*-------------------------------------------------------------------------* + * DPix: pix with double array * + *-------------------------------------------------------------------------*/ +/*! Pix with double array */ +typedef struct DPix DPIX; + +/*-------------------------------------------------------------------------* + * Compressed pix and arrays * + *-------------------------------------------------------------------------*/ +/*! Compressed Pix */ +typedef struct PixComp PIXC; + +/*! Array of compressed pix */ +typedef struct PixaComp PIXAC; + + + +/*-------------------------------------------------------------------------* + * Colors for 32 RGBA * + *-------------------------------------------------------------------------*/ +/*
+ * Notes: + * (1) These are the byte indices for colors in 32 bpp images. + * They are used through the GET/SET_DATA_BYTE accessors. + * The 4th byte, typically known as the "alpha channel" and used + * for blending, is used to a small extent in leptonica. + * (2) Do not change these values! If you redefine them, functions + * that have the shifts hardcoded for efficiency and conciseness + * (instead of using the constants below) will break. These + * functions are labelled with "***" next to their names at + * the top of the files in which they are defined. + * (3) The shifts to extract the red, green, blue and alpha components + * from a 32 bit pixel are defined here. + *+ */ + +/*! RGBA Color */ +enum { + COLOR_RED = 0, /*!< red color index in RGBA_QUAD */ + COLOR_GREEN = 1, /*!< green color index in RGBA_QUAD */ + COLOR_BLUE = 2, /*!< blue color index in RGBA_QUAD */ + L_ALPHA_CHANNEL = 3 /*!< alpha value index in RGBA_QUAD */ +}; + +static const l_int32 L_RED_SHIFT = + 8 * (sizeof(l_uint32) - 1 - COLOR_RED); /* 24 */ +static const l_int32 L_GREEN_SHIFT = + 8 * (sizeof(l_uint32) - 1 - COLOR_GREEN); /* 16 */ +static const l_int32 L_BLUE_SHIFT = + 8 * (sizeof(l_uint32) - 1 - COLOR_BLUE); /* 8 */ +static const l_int32 L_ALPHA_SHIFT = + 8 * (sizeof(l_uint32) - 1 - L_ALPHA_CHANNEL); /* 0 */ + + +/*-------------------------------------------------------------------------* + * Colors for drawing boxes * + *-------------------------------------------------------------------------*/ +/*! Box Color */ +enum { + L_DRAW_RED = 0, /*!< draw in red */ + L_DRAW_GREEN = 1, /*!< draw in green */ + L_DRAW_BLUE = 2, /*!< draw in blue */ + L_DRAW_SPECIFIED = 3, /*!< draw specified color */ + L_DRAW_RGB = 4, /*!< draw as sequence of r,g,b */ + L_DRAW_RANDOM = 5 /*!< draw randomly chosen colors */ +}; + + +/*-------------------------------------------------------------------------* + * Perceptual color weights * + *-------------------------------------------------------------------------*/ +/*
+ * Notes: + * (1) These perceptual weighting factors are ad-hoc, but they do + * add up to 1. Unlike, for example, the weighting factors for + * converting RGB to luminance, or more specifically to Y in the + * YUV colorspace. Those numbers come from the + * International Telecommunications Union, via ITU-R. + *+ */ +static const l_float32 L_RED_WEIGHT = 0.3f; /*!< Percept. weight for red */ +static const l_float32 L_GREEN_WEIGHT = 0.5f; /*!< Percept. weight for green */ +static const l_float32 L_BLUE_WEIGHT = 0.2f; /*!< Percept. weight for blue */ + + +/*-------------------------------------------------------------------------* + * Flags for colormap conversion * + *-------------------------------------------------------------------------*/ +/*! Cmap Conversion */ +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 */ + REMOVE_CMAP_TO_FULL_COLOR = 2, /*!< remove colormap for conv to 32 bpp */ + REMOVE_CMAP_WITH_ALPHA = 3, /*!< remove colormap and alpha */ + REMOVE_CMAP_BASED_ON_SRC = 4 /*!< remove depending on src format */ +}; + + +/*------------------------------------------------------------------------* + *! + *
+ * The following operation bit flags have been modified from Sun's + * original "bitblt" (bit block transfer) operations (from the 1980s). + * + * The 'op' in 'rasterop' is represented by an integer + * composed with Boolean functions using the set of five integers + * given below. The integers, and the op codes resulting from + * boolean expressions on them, need only be in the range from 0 to 15. + * The function is applied on a per-pixel basis. + * + * Examples: the op code representing ORing the src and dest + * is computed using the bit OR, as PIX_SRC | PIX_DST; the op + * code representing XORing src and dest is found from + * PIX_SRC ^ PIX_DST; the op code representing ANDing src and dest + * is found from PIX_SRC & PIX_DST. Note that + * PIX_NOT(PIX_CLR) = PIX_SET, and v.v., as they must be. + * + * We use the following set of definitions: + * + * #define PIX_SRC 0xc + * #define PIX_DST 0xa + * #define PIX_NOT(op) (op) ^ 0xf + * #define PIX_CLR 0x0 + * #define PIX_SET 0xf + * + * [These definitions differ from Sun's, in that Sun left-shifted + * each value by 1 pixel, and used the least significant bit as a + * flag for the "pseudo-operation" of clipping. We don't need + * this bit, because it is both efficient and safe ALWAYS to clip + * the rectangles to the src and dest images, which is what we do. + * See the notes in rop.h on the general choice of these bit flags.] + * + * Here are the 16 unique op flags: + * + * PIX_CLR 0000 0x0 + * PIX_SET 1111 0xf + * PIX_SRC 1100 0xc + * PIX_DST 1010 0xa + * PIX_NOT(PIX_SRC) 0011 0x3 + * PIX_NOT(PIX_DST) 0101 0x5 + * PIX_SRC | PIX_DST 1110 0xe + * PIX_SRC & PIX_DST 1000 0x8 + * PIX_SRC ^ PIX_DST 0110 0x6 + * PIX_NOT(PIX_SRC) | PIX_DST 1011 0xb + * PIX_NOT(PIX_SRC) & PIX_DST 0010 0x2 + * PIX_SRC | PIX_NOT(PIX_DST) 1101 0xd + * PIX_SRC & PIX_NOT(PIX_DST) 0100 0x4 + * PIX_NOT(PIX_SRC | PIX_DST) 0001 0x1 + * PIX_NOT(PIX_SRC & PIX_DST) 0111 0x7 + * PIX_NOT(PIX_SRC ^ PIX_DST) 1001 0x9 + * + *+ *-------------------------------------------------------------------------*/ + +#define PIX_SRC (0xc) /*!< use source pixels */ +#define PIX_DST (0xa) /*!< use destination pixels */ +#define PIX_NOT(op) ((op) ^ 0x0f) /*!< invert operation %op */ +#define PIX_CLR (0x0) /*!< clear pixels */ +#define PIX_SET (0xf) /*!< set pixels */ + +#define PIX_PAINT (PIX_SRC | PIX_DST) /*!< paint = src | dst */ +#define PIX_MASK (PIX_SRC & PIX_DST) /*!< mask = src & dst */ +#define PIX_SUBTRACT (PIX_DST & PIX_NOT(PIX_SRC)) /*!< subtract = */ + /*!< src & !dst */ +#define PIX_XOR (PIX_SRC ^ PIX_DST) /*!< xor = src ^ dst */ + + +/*-------------------------------------------------------------------------* + * Access and storage flags * + *-------------------------------------------------------------------------*/ +/* + *
+ * For Pix, Box, Pta and Numa, there are 3 standard methods for handling + * the retrieval or insertion of a struct: + * (1) direct insertion (Don't do this if there is another handle + * somewhere to this same struct!) + * (2) copy (Always safe, sets up a refcount of 1 on the new object. + * Can be undesirable if very large, such as an image or + * an array of images.) + * (3) clone (Makes another handle to the same struct, and bumps the + * refcount up by 1. OK to use except in two situations: + * (a) You change data through one of the handles but don't + * want those changes to be seen by the other handle. + * (b) The application is multi-threaded. Because the clone + * operation is not atomic (e.g., locked with a mutex), + * it is possible to end up with an incorrect ref count, + * causing either a memory leak or a crash. + * + * For Pixa and Boxa, which are structs that hold an array of clonable + * structs, there is an additional method: + * (4) copy-clone (Makes a new higher-level struct with a refcount + * of 1, but clones all the structs in the array.) + * + * Unlike the other structs, when retrieving a string from an Sarray, + * you are allowed to get a handle without a copy or clone (i.e., the + * string is not owned by the handle). You must not either free the string + * or insert it in some other struct that would own it. Specifically, + * for an Sarray, the copyflag for retrieval is either: + * L_COPY or L_NOCOPY + * and for insertion, the copyflag is either: + * L_COPY or one of {L_INSERT , L_NOCOPY} (the latter are equivalent + * for insertion)) + * Typical patterns are: + * (1) Reference a string in an Sarray with L_NOCOPY and insert a copy + * of it in another Sarray with L_COPY. + * (2) Copy a string from an Sarray with L_COPY and insert it in + * another Sarray with L_INSERT (or L_NOCOPY). + * In both cases, a copy is made and both Sarrays own their instance + * of that string. + *+ */ +/*! Object Access */ +enum { + L_NOCOPY = 0, /*!< do not copy the object; do not delete the ptr */ + L_INSERT = L_NOCOPY, /*!< stuff it in; do not copy or clone */ + L_COPY = 1, /*!< make/use a copy of the object */ + L_CLONE = 2, /*!< make/use clone (ref count) of the object */ + L_COPY_CLONE = 3 /*!< make a new array object (e.g., pixa) and fill */ + /*!< the array with clones (e.g., pix) */ +}; + +/*----------------------------------------------------------------------------* + * Sort flags * + *----------------------------------------------------------------------------*/ +/*! Sort Mode */ +enum { + L_SHELL_SORT = 1, /*!< use shell sort */ + L_BIN_SORT = 2 /*!< use bin sort */ +}; + +/*! Sort Order */ +enum { + L_SORT_INCREASING = 1, /*!< sort in increasing order */ + L_SORT_DECREASING = 2 /*!< sort in decreasing order */ +}; + +/*! Sort Type */ +enum { + L_SORT_BY_X = 1, /*!< sort box or c.c. by left edge location */ + L_SORT_BY_Y = 2, /*!< sort box or c.c. by top edge location */ + L_SORT_BY_RIGHT = 3, /*!< sort box or c.c. by right edge location */ + L_SORT_BY_BOT = 4, /*!< sort box or c.c. by bot edge location */ + L_SORT_BY_WIDTH = 5, /*!< sort box or c.c. by width */ + L_SORT_BY_HEIGHT = 6, /*!< sort box or c.c. by height */ + L_SORT_BY_MIN_DIMENSION = 7, /*!< sort box or c.c. by min dimension */ + L_SORT_BY_MAX_DIMENSION = 8, /*!< sort box or c.c. by max dimension */ + L_SORT_BY_PERIMETER = 9, /*!< sort box or c.c. by perimeter */ + L_SORT_BY_AREA = 10, /*!< sort box or c.c. by area */ + L_SORT_BY_ASPECT_RATIO = 11 /*!< sort box or c.c. by width/height ratio */ +}; + +/*---------------------------------------------------------------------------* + * Blend flags * + *---------------------------------------------------------------------------*/ +/*! Blend Types */ +enum { + L_BLEND_WITH_INVERSE = 1, /*!< add some of src inverse to itself */ + L_BLEND_TO_WHITE = 2, /*!< shift src colors towards white */ + L_BLEND_TO_BLACK = 3, /*!< shift src colors towards black */ + L_BLEND_GRAY = 4, /*!< blend src directly with blender */ + L_BLEND_GRAY_WITH_INVERSE = 5 /*!< add amount of src inverse to itself, */ + /*!< based on blender pix value */ +}; + +/*! Paint Selection */ +enum { + L_PAINT_LIGHT = 1, /*!< colorize non-black pixels */ + L_PAINT_DARK = 2 /*!< colorize non-white pixels */ +}; + +/*-------------------------------------------------------------------------* + * Graphics pixel setting * + *-------------------------------------------------------------------------*/ +/*! Pixel Setting */ +enum { + L_SET_PIXELS = 1, /*!< set all bits in each pixel to 1 */ + L_CLEAR_PIXELS = 2, /*!< set all bits in each pixel to 0 */ + L_FLIP_PIXELS = 3 /*!< flip all bits in each pixel */ +}; + +/*-------------------------------------------------------------------------* + * Size and location filter flags * + *-------------------------------------------------------------------------*/ +/*! Size Comparison */ +enum { + L_SELECT_IF_LT = 1, /*!< save if value is less than threshold */ + L_SELECT_IF_GT = 2, /*!< save if value is more than threshold */ + L_SELECT_IF_LTE = 3, /*!< save if value is <= to the threshold */ + L_SELECT_IF_GTE = 4 /*!< save if value is >= to the threshold */ +}; + +/*! Size Selection */ +enum { + L_SELECT_BY_WIDTH = 1, /*!< select by width; 1 bpp */ + L_SELECT_BY_HEIGHT = 2, /*!< select by height; 1 bpp */ + L_SELECT_BY_MAX_DIMENSION = 3, /*!< select by max of width and */ + /*!< height; 1 bpp */ + L_SELECT_BY_AREA = 4, /*!< select by foreground area; 1 bpp */ + L_SELECT_BY_PERIMETER = 5 /*!< select by perimeter; 1 bpp */ +}; + +/*! Location Filter */ +enum { + L_SELECT_WIDTH = 1, /*!< width must satisfy constraint */ + L_SELECT_HEIGHT = 2, /*!< height must satisfy constraint */ + L_SELECT_XVAL = 3, /*!< x value must satisfy constraint */ + L_SELECT_YVAL = 4, /*!< y value must satisfy constraint */ + L_SELECT_IF_EITHER = 5, /*!< either width or height (or xval */ + /*!< or yval) can satisfy constraint */ + L_SELECT_IF_BOTH = 6 /*!< both width and height (or xval */ + /*!< and yval must satisfy constraint */ +}; + +/*! Boxa Check */ +enum { + L_CHECK_WIDTH = 1, /*!< check and possibly modify width */ + L_CHECK_HEIGHT = 2, /*!< check and possibly modify height */ + L_CHECK_BOTH = 3 /*!< check and possibly modify both */ +}; + +/*-------------------------------------------------------------------------* + * Color component selection flags * + *-------------------------------------------------------------------------*/ +/*! Color Selection */ +enum { + L_SELECT_RED = 1, /*!< use red component */ + L_SELECT_GREEN = 2, /*!< use green component */ + L_SELECT_BLUE = 3, /*!< use blue component */ + L_SELECT_MIN = 4, /*!< use min color component */ + L_SELECT_MAX = 5, /*!< use max color component */ + L_SELECT_AVERAGE = 6, /*!< use average of color components */ + L_SELECT_HUE = 7, /*!< use hue value (in HSV color space) */ + L_SELECT_SATURATION = 8, /*!< use saturation value (in HSV space) */ + L_SELECT_WEIGHTED = 9 /*!< use weighted average of color comps */ +}; + +/*-------------------------------------------------------------------------* + * Color content flags * + *-------------------------------------------------------------------------*/ +/*! Color Content */ +enum { + L_INTERMED_DIFF = 1, /*!< intermediate of diff component values */ + L_AVE_MAX_DIFF_2 = 2, /*!< diff average closest comps to third */ + L_MAX_DIFF = 3 /*!< maximum diff of component values */ +}; + +/*-------------------------------------------------------------------------* + * 16-bit conversion flags * + *-------------------------------------------------------------------------*/ +/*! 16-bit Conversion */ +enum { + L_LS_BYTE = 1, /*!< use LSB */ + L_MS_BYTE = 2, /*!< use MSB */ + L_AUTO_BYTE = 3, /*!< use LSB if max(val) < 256; else MSB */ + L_CLIP_TO_FF = 4, /*!< use max(val, 255) */ + L_LS_TWO_BYTES = 5, /*!< use two LSB */ + L_MS_TWO_BYTES = 6, /*!< use two MSB */ + L_CLIP_TO_FFFF = 7 /*!< use max(val, 65535) */ +}; + +/*-------------------------------------------------------------------------* + * Rotate and shear flags * + *-------------------------------------------------------------------------*/ +/*! Rotation Type */ +enum { + L_ROTATE_AREA_MAP = 1, /*!< use area map rotation, if possible */ + L_ROTATE_SHEAR = 2, /*!< use shear rotation */ + L_ROTATE_SAMPLING = 3 /*!< use sampling */ +}; + +/*! Background Color */ +enum { + L_BRING_IN_WHITE = 1, /*!< bring in white pixels from the outside */ + L_BRING_IN_BLACK = 2 /*!< bring in black pixels from the outside */ +}; + +/*! Shear Point */ +enum { + L_SHEAR_ABOUT_CORNER = 1, /*!< shear image about UL corner */ + L_SHEAR_ABOUT_CENTER = 2 /*!< shear image about center */ +}; + +/*-------------------------------------------------------------------------* + * Affine transform order flags * + *-------------------------------------------------------------------------*/ +/*! Affine Transform Order */ +enum { + L_TR_SC_RO = 1, /*!< translate, scale, rotate */ + L_SC_RO_TR = 2, /*!< scale, rotate, translate */ + L_RO_TR_SC = 3, /*!< rotate, translate, scale */ + L_TR_RO_SC = 4, /*!< translate, rotate, scale */ + L_RO_SC_TR = 5, /*!< rotate, scale, translate */ + L_SC_TR_RO = 6 /*!< scale, translate, rotate */ +}; + +/*-------------------------------------------------------------------------* + * Grayscale filling flags * + *-------------------------------------------------------------------------*/ +/*! Grayscale Fill */ +enum { + L_FILL_WHITE = 1, /*!< fill white pixels (e.g, in fg map) */ + L_FILL_BLACK = 2 /*!< fill black pixels (e.g., in bg map) */ +}; + +/*-------------------------------------------------------------------------* + * Flags for setting to white or black * + *-------------------------------------------------------------------------*/ +/*! BlackWhite Set */ +enum { + L_SET_WHITE = 1, /*!< set pixels to white */ + L_SET_BLACK = 2 /*!< set pixels to black */ +}; + +/*-------------------------------------------------------------------------* + * Flags for getting white or black value * + *-------------------------------------------------------------------------*/ +/*! BlackWhite Get */ +enum { + L_GET_WHITE_VAL = 1, /*!< get white pixel value */ + L_GET_BLACK_VAL = 2 /*!< get black pixel value */ +}; + +/*-------------------------------------------------------------------------* + * Flags for 8 bit and 16 bit pixel sums * + *-------------------------------------------------------------------------*/ +/*! BlackWhite Sum */ +enum { + L_WHITE_IS_MAX = 1, /*!< white pixels are 0xff or 0xffff; black are 0 */ + L_BLACK_IS_MAX = 2 /*!< black pixels are 0xff or 0xffff; white are 0 */ +}; + +/*-------------------------------------------------------------------------* + * Dither parameters * + * If within this grayscale distance from black or white, * + * do not propagate excess or deficit to neighboring pixels. * + *-------------------------------------------------------------------------*/ +/*! Dither Distance */ +enum { + DEFAULT_CLIP_LOWER_1 = 10, /*!< dist to black with no prop; 1 bpp */ + DEFAULT_CLIP_UPPER_1 = 10, /*!< dist to black with no prop; 1 bpp */ + DEFAULT_CLIP_LOWER_2 = 5, /*!< dist to black with no prop; 2 bpp */ + DEFAULT_CLIP_UPPER_2 = 5 /*!< dist to black with no prop; 2 bpp */ +}; + +/*-------------------------------------------------------------------------* + * Distance type flags * + *-------------------------------------------------------------------------*/ +/*! Distance Type */ +enum { + L_MANHATTAN_DISTANCE = 1, /*!< L1 distance (e.g., in color space) */ + L_EUCLIDEAN_DISTANCE = 2 /*!< L2 distance */ +}; + +/*-------------------------------------------------------------------------* + * Distance Value flags * + *-------------------------------------------------------------------------*/ +/*! Distance Value */ +enum { + L_NEGATIVE = 1, /*!< values < 0 */ + L_NON_NEGATIVE = 2, /*!< values >= 0 */ + L_POSITIVE = 3, /*!< values > 0 */ + L_NON_POSITIVE = 4, /*!< values <= 0 */ + L_ZERO = 5, /*!< values = 0 */ + L_ALL = 6 /*!< all values */ +}; + +/*-------------------------------------------------------------------------* + * Statistical measures * + *-------------------------------------------------------------------------*/ +/*! Stats Type */ +enum { + L_MEAN_ABSVAL = 1, /*!< average of abs values */ + L_MEDIAN_VAL = 2, /*!< median value of set */ + L_MODE_VAL = 3, /*!< mode value of set */ + L_MODE_COUNT = 4, /*!< mode count of set */ + L_ROOT_MEAN_SQUARE = 5, /*!< rms of values */ + L_STANDARD_DEVIATION = 6, /*!< standard deviation from mean */ + L_VARIANCE = 7 /*!< variance of values */ +}; + +/*-------------------------------------------------------------------------* + * Set index selection flags * + *-------------------------------------------------------------------------*/ +/*! Index Selection */ +enum { + L_CHOOSE_CONSECUTIVE = 1, /*!< select 'n' consecutive */ + L_CHOOSE_SKIP_BY = 2 /*!< select at intervals of 'n' */ +}; + +/*-------------------------------------------------------------------------* + * Text orientation flags * + *-------------------------------------------------------------------------*/ +/*! Text Orientation */ +enum { + L_TEXT_ORIENT_UNKNOWN = 0, /*!< low confidence on text orientation */ + L_TEXT_ORIENT_UP = 1, /*!< portrait, text rightside-up */ + L_TEXT_ORIENT_LEFT = 2, /*!< landscape, text up to left */ + L_TEXT_ORIENT_DOWN = 3, /*!< portrait, text upside-down */ + L_TEXT_ORIENT_RIGHT = 4 /*!< landscape, text up to right */ +}; + +/*-------------------------------------------------------------------------* + * Edge orientation flags * + *-------------------------------------------------------------------------*/ +/*! Edge Orientation */ +enum { + L_HORIZONTAL_EDGES = 0, /*!< filters for horizontal edges */ + L_VERTICAL_EDGES = 1, /*!< filters for vertical edges */ + L_ALL_EDGES = 2 /*!< filters for all edges */ +}; + +/*-------------------------------------------------------------------------* + * Line orientation flags * + *-------------------------------------------------------------------------*/ +/*! Line Orientation */ +enum { + L_HORIZONTAL_LINE = 0, /*!< horizontal line */ + L_POS_SLOPE_LINE = 1, /*!< 45 degree line with positive slope */ + L_VERTICAL_LINE = 2, /*!< vertical line */ + L_NEG_SLOPE_LINE = 3, /*!< 45 degree line with negative slope */ + L_OBLIQUE_LINE = 4 /*!< neither horizontal nor vertical */ +}; + +/*-------------------------------------------------------------------------* + * Image orientation flags * + *-------------------------------------------------------------------------*/ +/*! Image Orientation */ +enum { + L_PORTRAIT_MODE = 0, /*!< typical: page is viewed with height > width */ + L_LANDSCAPE_MODE = 1 /*!< page is viewed at 90 deg to portrait mode */ +}; + +/*-------------------------------------------------------------------------* + * Scan direction flags * + *-------------------------------------------------------------------------*/ +/*! Scan Direction */ +enum { + L_FROM_LEFT = 0, /*!< scan from left */ + L_FROM_RIGHT = 1, /*!< scan from right */ + L_FROM_TOP = 2, /*!< scan from top */ + L_FROM_BOT = 3, /*!< scan from bottom */ + L_SCAN_NEGATIVE = 4, /*!< scan in negative direction */ + L_SCAN_POSITIVE = 5, /*!< scan in positive direction */ + L_SCAN_BOTH = 6, /*!< scan in both directions */ + L_SCAN_HORIZONTAL = 7, /*!< horizontal scan (direction unimportant) */ + L_SCAN_VERTICAL = 8 /*!< vertical scan (direction unimportant) */ +}; + +/*-------------------------------------------------------------------------* + * Box size adjustment and location flags * + *-------------------------------------------------------------------------*/ +/*! Box Adjustment */ +enum { + L_ADJUST_SKIP = 0, /*!< do not adjust */ + L_ADJUST_LEFT = 1, /*!< adjust left edge */ + L_ADJUST_RIGHT = 2, /*!< adjust right edge */ + L_ADJUST_LEFT_AND_RIGHT = 3, /*!< adjust both left and right edges */ + L_ADJUST_TOP = 4, /*!< adjust top edge */ + L_ADJUST_BOT = 5, /*!< adjust bottom edge */ + L_ADJUST_TOP_AND_BOT = 6, /*!< adjust both top and bottom edges */ + L_ADJUST_CHOOSE_MIN = 7, /*!< choose the min median value */ + L_ADJUST_CHOOSE_MAX = 8, /*!< choose the max median value */ + L_SET_LEFT = 9, /*!< set left side to a given value */ + L_SET_RIGHT = 10, /*!< set right side to a given value */ + L_SET_TOP = 11, /*!< set top side to a given value */ + L_SET_BOT = 12, /*!< set bottom side to a given value */ + L_GET_LEFT = 13, /*!< get left side location */ + L_GET_RIGHT = 14, /*!< get right side location */ + L_GET_TOP = 15, /*!< get top side location */ + L_GET_BOT = 16 /*!< get bottom side location */ +}; + +/*-------------------------------------------------------------------------* + * Flags for modifying box boundaries using a second box * + *-------------------------------------------------------------------------*/ +/*! Box Boundary Mod */ +enum { + L_USE_MINSIZE = 1, /*!< use boundaries giving min size */ + L_USE_MAXSIZE = 2, /*!< use boundaries giving max size */ + L_SUB_ON_LOC_DIFF = 3, /*!< modify boundary if big location diff */ + L_SUB_ON_SIZE_DIFF = 4, /*!< modify boundary if big size diff */ + L_USE_CAPPED_MIN = 5, /*!< modify boundary with capped min */ + L_USE_CAPPED_MAX = 6 /*!< modify boundary with capped max */ +}; + +/*-------------------------------------------------------------------------* + * Handling overlapping bounding boxes in boxa * + *-------------------------------------------------------------------------*/ +/*! Box Overlap Mod */ +enum { + L_COMBINE = 1, /*!< resize to bounding region; remove smaller */ + L_REMOVE_SMALL = 2 /*!< only remove smaller */ +}; + +/*-------------------------------------------------------------------------* + * Selecting or making a box from two (intersecting) boxes * + *-------------------------------------------------------------------------*/ +/*! Box Combine or Select */ +enum { + L_GEOMETRIC_UNION = 1, /*!< use union of two boxes */ + L_GEOMETRIC_INTERSECTION = 2, /*!< use intersection of two boxes */ + L_LARGEST_AREA = 3, /*!< use box with largest area */ + L_SMALLEST_AREA = 4 /*!< use box with smallest area */ +}; + +/*-------------------------------------------------------------------------* + * Flags for replacing invalid boxes * + *-------------------------------------------------------------------------*/ +/*! Box Replacement */ +enum { + L_USE_ALL_BOXES = 1, /*!< consider all boxes in the sequence */ + L_USE_SAME_PARITY_BOXES = 2 /*!< consider boxes with the same parity */ +}; + +/*-------------------------------------------------------------------------* + * Flags for box corners and center * + *-------------------------------------------------------------------------*/ +/*! Box Corners and Center */ +enum { + L_UPPER_LEFT = 1, /*!< UL corner */ + L_UPPER_RIGHT = 2, /*!< UR corner */ + L_LOWER_LEFT = 3, /*!< LL corner */ + L_LOWER_RIGHT = 4, /*!< LR corner */ + L_BOX_CENTER = 5 /*!< center */ +}; + +/*-------------------------------------------------------------------------* + * Horizontal warp * + *-------------------------------------------------------------------------*/ +/*! Horiz Warp Stretch */ +enum { + L_WARP_TO_LEFT = 1, /*!< increasing stretch or contraction to left */ + L_WARP_TO_RIGHT = 2 /*!< increasing stretch or contraction to right */ +}; + +/*! Horiz Warp Mode */ +enum { + L_LINEAR_WARP = 1, /*!< stretch or contraction grows linearly */ + L_QUADRATIC_WARP = 2 /*!< stretch or contraction grows quadratically */ +}; + +/*-------------------------------------------------------------------------* + * Pixel selection for resampling * + *-------------------------------------------------------------------------*/ +/*! Pixel Selection */ +enum { + L_INTERPOLATED = 1, /*!< linear interpolation from src pixels */ + L_SAMPLED = 2 /*!< nearest src pixel sampling only */ +}; + +/*-------------------------------------------------------------------------* + * Thinning flags * + *-------------------------------------------------------------------------*/ +/*! Thinning Polarity */ +enum { + L_THIN_FG = 1, /*!< thin foreground of 1 bpp image */ + L_THIN_BG = 2 /*!< thin background of 1 bpp image */ +}; + +/*-------------------------------------------------------------------------* + * Runlength flags * + *-------------------------------------------------------------------------*/ +/*! Runlength Direction */ +enum { + L_HORIZONTAL_RUNS = 0, /*!< determine runlengths of horizontal runs */ + L_VERTICAL_RUNS = 1 /*!< determine runlengths of vertical runs */ +}; + +/*-------------------------------------------------------------------------* + * Edge filter flags * + *-------------------------------------------------------------------------*/ +/*! Edge Filter */ +enum { + L_SOBEL_EDGE = 1, /*!< Sobel edge filter */ + L_TWO_SIDED_EDGE = 2 /*!< Two-sided edge filter */ +}; + +/*-------------------------------------------------------------------------* + * Subpixel color component ordering in LCD display * + *-------------------------------------------------------------------------*/ +/*! Subpixel Color Order */ +enum { + L_SUBPIXEL_ORDER_RGB = 1, /*!< sensor order left-to-right RGB */ + L_SUBPIXEL_ORDER_BGR = 2, /*!< sensor order left-to-right BGR */ + L_SUBPIXEL_ORDER_VRGB = 3, /*!< sensor order top-to-bottom RGB */ + L_SUBPIXEL_ORDER_VBGR = 4 /*!< sensor order top-to-bottom BGR */ +}; + +/*-------------------------------------------------------------------------* + * HSV histogram flags * + *-------------------------------------------------------------------------*/ +/*! HSV Histogram */ +enum { + L_HS_HISTO = 1, /*!< Use hue-saturation histogram */ + L_HV_HISTO = 2, /*!< Use hue-value histogram */ + L_SV_HISTO = 3 /*!< Use saturation-value histogram */ +}; + +/*-------------------------------------------------------------------------* + * HSV Region flags (inclusion, exclusion) * + *-------------------------------------------------------------------------*/ +/*! HSV Region */ +enum { + L_INCLUDE_REGION = 1, /*!< Use pixels with specified HSV region */ + L_EXCLUDE_REGION = 2 /*!< Use pixels outside HSV region */ +}; + +/*-------------------------------------------------------------------------* + * Location flags for adding text to a pix * + *-------------------------------------------------------------------------*/ +/*! Add Text Location */ +enum { + L_ADD_ABOVE = 1, /*!< Add text above the image */ + L_ADD_BELOW = 2, /*!< Add text below the image */ + L_ADD_LEFT = 3, /*!< Add text to the left of the image */ + L_ADD_RIGHT = 4, /*!< Add text to the right of the image */ + L_ADD_AT_TOP = 5, /*!< Add text over the top of the image */ + L_ADD_AT_BOT = 6, /*!< Add text over the bottom of the image */ + L_ADD_AT_LEFT = 7, /*!< Add text over left side of the image */ + L_ADD_AT_RIGHT = 8 /*!< Add text over right side of the image */ +}; + +/*-------------------------------------------------------------------------* + * Flags for plotting on a pix * + *-------------------------------------------------------------------------*/ +/*! Pix Plot */ +enum { + L_PLOT_AT_TOP = 1, /*!< Plot horizontally at top */ + L_PLOT_AT_MID_HORIZ = 2, /*!< Plot horizontally at middle */ + L_PLOT_AT_BOT = 3, /*!< Plot horizontally at bottom */ + L_PLOT_AT_LEFT = 4, /*!< Plot vertically at left */ + L_PLOT_AT_MID_VERT = 5, /*!< Plot vertically at middle */ + L_PLOT_AT_RIGHT = 6 /*!< Plot vertically at right */ +}; + +/*-------------------------------------------------------------------------* + * Flags for making simple masks * + *-------------------------------------------------------------------------*/ +/*! Mask Generation */ +enum { + L_USE_INNER = 1, /*!< Select the interior part */ + L_USE_OUTER = 2 /*!< Select the outer part (e.g., a frame) */ +}; + +/*-------------------------------------------------------------------------* + * Flags for selecting display program * + *-------------------------------------------------------------------------*/ +/*! Display Program */ +enum { + L_DISPLAY_WITH_XZGV = 1, /*!< Use xzgv with pixDisplay() */ + L_DISPLAY_WITH_XLI = 2, /*!< Use xli with pixDisplay() */ + L_DISPLAY_WITH_XV = 3, /*!< Use xv with pixDisplay() */ + L_DISPLAY_WITH_IV = 4, /*!< Use irfvanview (win) with pixDisplay() */ + L_DISPLAY_WITH_OPEN = 5 /*!< Use open (apple) with pixDisplay() */ +}; + +/*-------------------------------------------------------------------------* + * Flag(s) used in the 'special' pix field for non-default operations * + * - 0 is default for chroma sampling in jpeg * + * - 10-19 are used for zlib compression in png write * + * - 4 and 8 are used for specifying connectivity in labelling * + *-------------------------------------------------------------------------*/ +/*! Flags used in Pix::special */ +enum { + L_NO_CHROMA_SAMPLING_JPEG = 1 /*!< Write full resolution chroma */ +}; + +/*-------------------------------------------------------------------------* + * Handling negative values in conversion to unsigned int * + *-------------------------------------------------------------------------*/ +/*! Negative Value */ +enum { + L_CLIP_TO_ZERO = 1, /*!< Clip negative values to 0 */ + L_TAKE_ABSVAL = 2 /*!< Convert to positive using L_ABS() */ +}; + +/*-------------------------------------------------------------------------* + * Relative to zero flags * + *-------------------------------------------------------------------------*/ +/*! Relative To Zero */ +enum { + L_LESS_THAN_ZERO = 1, /*!< Choose values less than zero */ + L_EQUAL_TO_ZERO = 2, /*!< Choose values equal to zero */ + L_GREATER_THAN_ZERO = 3 /*!< Choose values greater than zero */ +}; + +/*-------------------------------------------------------------------------* + * Flags for adding or removing trailing slash from string * + *-------------------------------------------------------------------------*/ +/*! Trailing Slash */ +enum { + L_ADD_TRAIL_SLASH = 1, /*!< Add trailing slash to string */ + L_REMOVE_TRAIL_SLASH = 2 /*!< Remove trailing slash from string */ +}; + +/*-------------------------------------------------------------------------* + * Pix allocator and deallocator function types * + *-------------------------------------------------------------------------*/ +/*! Allocator function type */ +typedef void *(*alloc_fn)(size_t); + +/*! Deallocator function type */ +typedef void (*dealloc_fn)(void *); + +#endif /* LEPTONICA_PIX_H */ diff --git a/third_party/leptonica/uos/amd64/include/leptonica/pix_internal.h b/third_party/leptonica/uos/amd64/include/leptonica/pix_internal.h new file mode 100644 index 00000000..ca20032e --- /dev/null +++ b/third_party/leptonica/uos/amd64/include/leptonica/pix_internal.h @@ -0,0 +1,426 @@ +/*====================================================================* + - Copyright (C) 2001 Leptonica. All rights reserved. + - + - Redistribution and use in source and binary forms, with or without + - modification, are permitted provided that the following conditions + - are met: + - 1. Redistributions of source code must retain the above copyright + - notice, this list of conditions and the following disclaimer. + - 2. Redistributions in binary form must reproduce the above + - copyright notice, this list of conditions and the following + - disclaimer in the documentation and/or other materials + - provided with the distribution. + - + - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ANY + - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *====================================================================*/ + +#ifndef LEPTONICA_PIX_INTERNAL_H +#define LEPTONICA_PIX_INTERNAL_H + +/*! + * \file pix_internal.h + * + *
+ * Valid image types in leptonica: + * Pix: 1 bpp, with and without colormap + * Pix: 2 bpp, with and without colormap + * Pix: 4 bpp, with and without colormap + * Pix: 8 bpp, with and without colormap + * Pix: 16 bpp (1 spp) + * Pix: 32 bpp (rgb, 3 spp) + * Pix: 32 bpp (rgba, 4 spp) + * FPix: 32 bpp float + * DPix: 64 bpp double + * Notes: + * (1) The only valid Pix image type with alpha is rgba. + * In particular, the alpha component is not used in + * cmapped images. + * (2) PixComp can hold any Pix with IFF_PNG encoding. + * + * This file is internal: it is not part of the public interface. + * It contains the definitions of most of the image-related structs + * used in leptonica: + * struct Pix + * struct PixColormap + * struct RGBA_Quad + * struct Pixa + * struct Pixaa + * struct Box + * struct Boxa + * struct Boxaa + * struct Pta + * struct Ptaa + * struct Pixacc + * struct PixTiling + * struct FPix + * struct FPixa + * struct DPix + * struct PixComp + * struct PixaComp + * + * This file can be #included after allheaders.h in source files that + * require direct access to the internal data fields in these structs. + * + * Notes on the pixels in the raster image. Most of this information + * can also be found in pix.h. + * + * (1) The image data is stored in a single contiguous + * array of l_uint32, into which the pixels are packed. + * By "packed" we mean that there are no unused bits + * between pixels, except for end-of-line padding to + * satisfy item (2) below. + * + * (2) Every image raster line begins on a 32-bit word + * boundary within this array. + * + * (3) Pix image data is stored in 32-bit units, with the + * pixels ordered from left to right in the image being + * stored in order from the MSB to LSB within the word, + * for both big-endian and little-endian machines. + * This is the natural ordering for big-endian machines, + * as successive bytes are stored and fetched progressively + * to the right. However, for little-endians, when storing + * we re-order the bytes from this byte stream order, and + * reshuffle again for byte access on 32-bit entities. + * So if the bytes come in sequence from left to right, we + * store them on little-endians in byte order: + * 3 2 1 0 7 6 5 4 ... + * This MSB to LSB ordering allows left and right shift + * operations on 32 bit words to move the pixels properly. + * + * (4) We use 32 bit pixels for both RGB and RGBA color images. + * The A (alpha) byte is ignored in most leptonica functions + * operating on color images. Within each 4 byte pixel, the + * color samples are ordered from MSB to LSB, as follows: + * + * | MSB | 2nd MSB | 3rd MSB | LSB | + * red green blue alpha + * 0 1 2 3 (big-endian) + * 3 2 1 0 (little-endian) + * + * Because we use MSB to LSB ordering within the 32-bit word, + * the individual 8-bit samples can be accessed with + * GET_DATA_BYTE and SET_DATA_BYTE macros, using the + * (implicitly big-ending) ordering + * red: byte 0 (MSB) + * green: byte 1 (2nd MSB) + * blue: byte 2 (3rd MSB) + * alpha: byte 3 (LSB) + * + * The specific color assignment is made in this file, + * through the definitions of COLOR_RED, etc. Then the R, G + * B and A sample values can be retrieved using + * redval = GET_DATA_BYTE(&pixel, COLOR_RED); + * greenval = GET_DATA_BYTE(&pixel, COLOR_GREEN); + * blueval = GET_DATA_BYTE(&pixel, COLOR_BLUE); + * alphaval = GET_DATA_BYTE(&pixel, L_ALPHA_CHANNEL); + * and they can be set with + * SET_DATA_BYTE(&pixel, COLOR_RED, redval); + * SET_DATA_BYTE(&pixel, COLOR_GREEN, greenval); + * SET_DATA_BYTE(&pixel, COLOR_BLUE, blueval); + * SET_DATA_BYTE(&pixel, L_ALPHA_CHANNEL, alphaval); + * + * More efficiently, these components can be extracted directly + * by shifting and masking, explicitly using the values in + * L_RED_SHIFT, etc.: + * (pixel32 >> L_RED_SHIFT) & 0xff; (red) + * (pixel32 >> L_GREEN_SHIFT) & 0xff; (green) + * (pixel32 >> L_BLUE_SHIFT) & 0xff; (blue) + * (pixel32 >> L_ALPHA_SHIFT) & 0xff; (alpha) + * The functions extractRGBValues() and extractRGBAValues() are + * provided to do this. Likewise, the pixels can be set + * directly by shifting, using composeRGBPixel() and + * composeRGBAPixel(). + * + * All these operations work properly on both big- and little-endians. + * + * (5) A reference count is held within each pix, giving the + * number of ptrs to the pix. When a pixClone() call + * is made, the ref count is increased by 1, and + * when a pixDestroy() call is made, the reference count + * of the pix is decremented. The pix is only destroyed + * when the reference count goes to zero. + * + * (6) The version numbers (below) are used in the serialization + * of these data structures. They are placed in the files, + * and rarely (if ever) change. + * + * (7) The serialization dependencies are as follows: + * pixaa : pixa : boxa + * boxaa : boxa + * So, for example, pixaa and boxaa can be changed without + * forcing a change in pixa or boxa. However, if pixa is + * changed, it forces a change in pixaa, and if boxa is + * changed, if forces a change in the other three. + * We define four version numbers: + * PIXAA_VERSION_NUMBER + * PIXA_VERSION_NUMBER + * BOXAA_VERSION_NUMBER + * BOXA_VERSION_NUMBER + *+ *-------------------------------------------------------------------------*/ + +/*-------------------------------------------------------------------------* + * Basic Pix * + *-------------------------------------------------------------------------*/ + /* The 'special' field is by default 0, but it can hold integers + * that direct non-default actions, e.g., in png and jpeg I/O. */ + +/*! Basic Pix */ +struct Pix +{ + l_uint32 w; /*!< width in pixels */ + l_uint32 h; /*!< height in pixels */ + l_uint32 d; /*!< depth in bits (bpp) */ + l_uint32 spp; /*!< number of samples per pixel */ + l_uint32 wpl; /*!< 32-bit words/line */ + l_atomic refcount; /*!< reference count (1 if no clones) */ + l_int32 xres; /*!< image res (ppi) in x direction */ + /*!< (use 0 if unknown) */ + l_int32 yres; /*!< image res (ppi) in y direction */ + /*!< (use 0 if unknown) */ + l_int32 informat; /*!< input file format, IFF_* */ + l_int32 special; /*!< special instructions for I/O, etc */ + char *text; /*!< text string associated with pix */ + struct PixColormap *colormap; /*!< colormap (may be null) */ + l_uint32 *data; /*!< the image data */ +}; + +/*! Colormap of a Pix */ +struct PixColormap +{ + void *array; /*!< colormap table (array of RGBA_QUAD) */ + l_int32 depth; /*!< of pix (1, 2, 4 or 8 bpp) */ + l_int32 nalloc; /*!< number of color entries allocated */ + l_int32 n; /*!< number of color entries used */ +}; + + + /*! Colormap table entry (after the BMP version). + * Note that the BMP format stores the colormap table exactly + * as it appears here, with color samples being stored sequentially, + * in the order (b,g,r,a). */ +struct RGBA_Quad +{ + l_uint8 blue; /*!< blue value */ + l_uint8 green; /*!< green value */ + l_uint8 red; /*!< red value */ + l_uint8 alpha; /*!< alpha value */ +}; + + +/*-------------------------------------------------------------------------* + * Array of pix * + *-------------------------------------------------------------------------*/ + /* Serialization for primary data structures */ +#define PIXAA_VERSION_NUMBER 2 /*!< Version for Pixaa serialization */ +#define PIXA_VERSION_NUMBER 2 /*!< Version for Pixa serialization */ +#define BOXA_VERSION_NUMBER 2 /*!< Version for Boxa serialization */ +#define BOXAA_VERSION_NUMBER 3 /*!< Version for Boxaa serialization */ + +/*! Array of pix */ +struct Pixa +{ + l_int32 n; /*!< number of Pix in ptr array */ + l_int32 nalloc; /*!< number of Pix ptrs allocated */ + l_atomic refcount; /*!< reference count (1 if no clones) */ + struct Pix **pix; /*!< the array of ptrs to pix */ + struct Boxa *boxa; /*!< array of boxes */ +}; + +/*! Array of arrays of pix */ +struct Pixaa +{ + l_int32 n; /*!< number of Pixa in ptr array */ + l_int32 nalloc; /*!< number of Pixa ptrs allocated */ + struct Pixa **pixa; /*!< array of ptrs to pixa */ + struct Boxa *boxa; /*!< array of boxes */ +}; + + +/*-------------------------------------------------------------------------* + * Basic rectangle and rectangle arrays * + *-------------------------------------------------------------------------*/ +/*! Basic rectangle */ +struct Box +{ + l_int32 x; /*!< left coordinate */ + l_int32 y; /*!< top coordinate */ + l_int32 w; /*!< box width */ + l_int32 h; /*!< box height */ + l_atomic refcount; /*!< reference count (1 if no clones) */ +}; + +/*! Array of Box */ +struct Boxa +{ + l_int32 n; /*!< number of box in ptr array */ + l_int32 nalloc; /*!< number of box ptrs allocated */ + l_atomic refcount; /*!< reference count (1 if no clones) */ + struct Box **box; /*!< box ptr array */ +}; + +/*! Array of Boxa */ +struct Boxaa +{ + l_int32 n; /*!< number of boxa in ptr array */ + l_int32 nalloc; /*!< number of boxa ptrs allocated */ + struct Boxa **boxa; /*!< boxa ptr array */ +}; + + +/*-------------------------------------------------------------------------* + * Array of points * + *-------------------------------------------------------------------------*/ +#define PTA_VERSION_NUMBER 1 /*!< Version for Pta serialization */ + +/*! Array of points */ +struct Pta +{ + l_int32 n; /*!< actual number of pts */ + l_int32 nalloc; /*!< size of allocated arrays */ + l_atomic refcount; /*!< reference count (1 if no clones) */ + l_float32 *x, *y; /*!< arrays of floats */ +}; + + +/*-------------------------------------------------------------------------* + * Array of Pta * + *-------------------------------------------------------------------------*/ +/*! Array of Pta */ +struct Ptaa +{ + l_int32 n; /*!< number of pta in ptr array */ + l_int32 nalloc; /*!< number of pta ptrs allocated */ + struct Pta **pta; /*!< pta ptr array */ +}; + + +/*-------------------------------------------------------------------------* + * Pix accumulator container * + *-------------------------------------------------------------------------*/ +/*! Pix accumulator container */ +struct Pixacc +{ + l_int32 w; /*!< array width */ + l_int32 h; /*!< array height */ + l_int32 offset; /*!< used to allow negative */ + /*!< intermediate results */ + struct Pix *pix; /*!< the 32 bit accumulator pix */ +}; + + +/*-------------------------------------------------------------------------* + * Pix tiling * + *-------------------------------------------------------------------------*/ +/*! Pix tiling */ +struct PixTiling +{ + struct Pix *pix; /*!< input pix (a clone) */ + l_int32 nx; /*!< number of tiles horizontally */ + l_int32 ny; /*!< number of tiles vertically */ + l_int32 w; /*!< tile width */ + l_int32 h; /*!< tile height */ + l_int32 xoverlap; /*!< overlap on left and right */ + l_int32 yoverlap; /*!< overlap on top and bottom */ + l_int32 strip; /*!< strip for paint; default is TRUE */ +}; + + +/*-------------------------------------------------------------------------* + * FPix: pix with float array * + *-------------------------------------------------------------------------*/ +#define FPIX_VERSION_NUMBER 2 /*!< Version for FPix serialization */ + +/*! Pix with float array */ +struct FPix +{ + l_int32 w; /*!< width in pixels */ + l_int32 h; /*!< height in pixels */ + l_int32 wpl; /*!< 32-bit words/line */ + l_atomic refcount; /*!< reference count (1 if no clones) */ + l_int32 xres; /*!< image res (ppi) in x direction */ + /*!< (use 0 if unknown) */ + l_int32 yres; /*!< image res (ppi) in y direction */ + /*!< (use 0 if unknown) */ + l_float32 *data; /*!< the float image data */ +}; + +/*! Array of FPix */ +struct FPixa +{ + l_int32 n; /*!< number of fpix in ptr array */ + l_int32 nalloc; /*!< number of fpix ptrs allocated */ + l_atomic refcount; /*!< reference count (1 if no clones) */ + struct FPix **fpix; /*!< the array of ptrs to fpix */ +}; + + +/*-------------------------------------------------------------------------* + * DPix: pix with double array * + *-------------------------------------------------------------------------*/ +#define DPIX_VERSION_NUMBER 2 /*!< Version for DPix serialization */ + +/*! Pix with double array */ +struct DPix +{ + l_int32 w; /*!< width in pixels */ + l_int32 h; /*!< height in pixels */ + l_int32 wpl; /*!< 32-bit words/line */ + l_atomic refcount; /*!< reference count (1 if no clones) */ + l_int32 xres; /*!< image res (ppi) in x direction */ + /*!< (use 0 if unknown) */ + l_int32 yres; /*!< image res (ppi) in y direction */ + /*!< (use 0 if unknown) */ + l_float64 *data; /*!< the double image data */ +}; + + +/*-------------------------------------------------------------------------* + * PixComp: compressed pix * + *-------------------------------------------------------------------------*/ +/*! Compressed Pix */ +struct PixComp +{ + l_int32 w; /*!< width in pixels */ + l_int32 h; /*!< height in pixels */ + l_int32 d; /*!< depth in bits */ + l_int32 xres; /*!< image res (ppi) in x direction */ + /*!< (use 0 if unknown) */ + l_int32 yres; /*!< image res (ppi) in y direction */ + /*!< (use 0 if unknown) */ + l_int32 comptype; /*!< compressed format (IFF_TIFF_G4, */ + /*!< IFF_PNG, IFF_JFIF_JPEG) */ + char *text; /*!< text string associated with pix */ + l_int32 cmapflag; /*!< flag (1 for cmap, 0 otherwise) */ + l_uint8 *data; /*!< the compressed image data */ + size_t size; /*!< size of the data array */ +}; + + +/*-------------------------------------------------------------------------* + * PixaComp: array of compressed pix * + *-------------------------------------------------------------------------*/ +#define PIXACOMP_VERSION_NUMBER 2 /*!< Version for PixaComp serialization */ + +/*! Array of compressed pix */ +struct PixaComp +{ + l_int32 n; /*!< number of PixComp in ptr array */ + l_int32 nalloc; /*!< number of PixComp ptrs allocated */ + l_int32 offset; /*!< indexing offset into ptr array */ + struct PixComp **pixc; /*!< the array of ptrs to PixComp */ + struct Boxa *boxa; /*!< array of boxes */ +}; + +#endif /* LEPTONICA_PIX_INTERNAL_H */ diff --git a/third_party/leptonica/uos/amd64/include/leptonica/ptra.h b/third_party/leptonica/uos/amd64/include/leptonica/ptra.h new file mode 100644 index 00000000..705d97af --- /dev/null +++ b/third_party/leptonica/uos/amd64/include/leptonica/ptra.h @@ -0,0 +1,97 @@ +/*====================================================================* + - Copyright (C) 2001 Leptonica. All rights reserved. + - + - Redistribution and use in source and binary forms, with or without + - modification, are permitted provided that the following conditions + - are met: + - 1. Redistributions of source code must retain the above copyright + - notice, this list of conditions and the following disclaimer. + - 2. Redistributions in binary form must reproduce the above + - copyright notice, this list of conditions and the following + - disclaimer in the documentation and/or other materials + - provided with the distribution. + - + - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ANY + - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *====================================================================*/ + +#ifndef LEPTONICA_PTRA_H +#define LEPTONICA_PTRA_H + +/*! + * \file ptra.h + * + *
+ * Contains the following structs: + * struct L_Ptra + * struct L_Ptraa + * + * Contains definitions for: + * L_Ptra compaction flags for removal + * L_Ptra shifting flags for insert + * L_Ptraa accessor flags + *+ */ + + /* Bound on max initial ptra size */ +LEPT_DLL extern const l_uint32 MaxInitPtraSize; + +/*------------------------------------------------------------------------* + * Generic Ptr Array Structs * + *------------------------------------------------------------------------*/ + + /*! Generic pointer array */ +struct L_Ptra +{ + l_int32 nalloc; /*!< size of allocated ptr array */ + l_int32 imax; /*!< greatest valid index */ + l_int32 nactual; /*!< actual number of stored elements */ + void **array; /*!< ptr array */ +}; +typedef struct L_Ptra L_PTRA; + + + /*! Array of generic pointer arrays */ +struct L_Ptraa +{ + l_int32 nalloc; /*!< size of allocated ptr array */ + struct L_Ptra **ptra; /*!< array of ptra */ +}; +typedef struct L_Ptraa L_PTRAA; + + + +/*------------------------------------------------------------------------* + * Accessor and modifier flags for L_Ptra and L_Ptraa * + *------------------------------------------------------------------------*/ + +/*! Ptra Removal */ +enum { + L_NO_COMPACTION = 1, /*!< null the pointer only */ + L_COMPACTION = 2 /*!< compact the array */ +}; + +/*! Ptra Insertion */ +enum { + L_AUTO_DOWNSHIFT = 0, /*!< choose based on number of holes */ + L_MIN_DOWNSHIFT = 1, /*!< downshifts min # of ptrs below insert */ + L_FULL_DOWNSHIFT = 2 /*!< downshifts all ptrs below insert */ +}; + +/*! Ptraa Accessor */ +enum { + L_HANDLE_ONLY = 0, /*!< ptr to L_Ptra; caller can inspect only */ + L_REMOVE = 1 /*!< caller owns; destroy or save in L_Ptraa */ +}; + + +#endif /* LEPTONICA_PTRA_H */ diff --git a/third_party/leptonica/uos/amd64/include/leptonica/queue.h b/third_party/leptonica/uos/amd64/include/leptonica/queue.h new file mode 100644 index 00000000..fd380e83 --- /dev/null +++ b/third_party/leptonica/uos/amd64/include/leptonica/queue.h @@ -0,0 +1,77 @@ +/*====================================================================* + - Copyright (C) 2001 Leptonica. All rights reserved. + - + - Redistribution and use in source and binary forms, with or without + - modification, are permitted provided that the following conditions + - are met: + - 1. Redistributions of source code must retain the above copyright + - notice, this list of conditions and the following disclaimer. + - 2. Redistributions in binary form must reproduce the above + - copyright notice, this list of conditions and the following + - disclaimer in the documentation and/or other materials + - provided with the distribution. + - + - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ANY + - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *====================================================================*/ + +#ifndef LEPTONICA_QUEUE_H +#define LEPTONICA_QUEUE_H + +/*! + * \file queue.h + * + *
+ * Expandable pointer queue for arbitrary void* data. + * + * The L_Queue is a fifo that implements a queue of void* pointers. + * It can be used to hold a queue of any type of struct. + * + * Internally, it maintains two counters: + * nhead: location of head (in ptrs) from the beginning + * of the array. + * nelem: number of ptr elements stored in the queue. + * + * The element at the head of the queue, which is the next to + * be removed, is array[nhead]. The location at the tail of the + * queue to which the next element will be added is + * array[nhead + nelem]. + * + * As items are added to the queue, nelem increases. + * As items are removed, nhead increases and nelem decreases. + * Any time the tail reaches the end of the allocated array, + * all the pointers are shifted to the left, so that the head + * is at the beginning of the array. + * If the array becomes more than 3/4 full, it doubles in size. + * + * The auxiliary stack can be used in a wrapper for re-using + * items popped from the queue. It is not made by default. + * + * For further implementation details, see queue.c. + *+ */ + +/*! Expandable pointer queue for arbitrary void* data */ +struct L_Queue +{ + l_int32 nalloc; /*!< size of allocated ptr array */ + l_int32 nhead; /*!< location of head (in ptrs) from the */ + /*!< beginning of the array */ + l_int32 nelem; /*!< number of elements stored in the queue */ + void **array; /*!< ptr array */ + struct L_Stack *stack; /*!< auxiliary stack */ + +}; +typedef struct L_Queue L_QUEUE; + + +#endif /* LEPTONICA_QUEUE_H */ diff --git a/third_party/leptonica/uos/amd64/include/leptonica/rbtree.h b/third_party/leptonica/uos/amd64/include/leptonica/rbtree.h new file mode 100644 index 00000000..6977d336 --- /dev/null +++ b/third_party/leptonica/uos/amd64/include/leptonica/rbtree.h @@ -0,0 +1,91 @@ +/*====================================================================* + - Copyright (C) 2001 Leptonica. All rights reserved. + - + - Redistribution and use in source and binary forms, with or without + - modification, are permitted provided that the following conditions + - are met: + - 1. Redistributions of source code must retain the above copyright + - notice, this list of conditions and the following disclaimer. + - 2. Redistributions in binary form must reproduce the above + - copyright notice, this list of conditions and the following + - disclaimer in the documentation and/or other materials + - provided with the distribution. + - + - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ANY + - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *====================================================================*/ + +/* + * Modified from the excellent code here: + * http://en.literateprograms.org/Red-black_tree_(C)?oldid=19567 + * which has been placed in the public domain under the Creative Commons + * CC0 1.0 waiver (http://creativecommons.org/publicdomain/zero/1.0/). + * + * When the key is generated from a hash (e.g., string --> uint64), + * there is always the possibility of having collisions, but to make + * the collision probability very low requires using a large hash. + * For that reason, the key types are 64 bit quantities, which will result + * in a negligible probabililty of collisions for millions of hashed values. + * Using 8 byte keys instead of 4 byte keys requires a little more + * storage, but the simplification in being able to ignore collisions + * with the red-black trees for most applications is worth it. + */ + +#ifndef LEPTONICA_RBTREE_H +#define LEPTONICA_RBTREE_H + + /*! The three valid key types for red-black trees, maps and sets. */ +/*! RBTree Key Type */ +enum { + L_INT_TYPE = 1, + L_UINT_TYPE = 2, + L_FLOAT_TYPE = 3 +}; + + /*! + * Storage for keys and values for red-black trees, maps and sets. + *
+ * Note: + * (1) Keys and values of the valid key types are all 64-bit + * (2) (void *) can be used for values but not for keys. + *+ */ +union Rb_Type { + l_int64 itype; + l_uint64 utype; + l_float64 ftype; + void *ptype; +}; +typedef union Rb_Type RB_TYPE; + +struct L_Rbtree { + struct L_Rbtree_Node *root; + l_int32 keytype; +}; +typedef struct L_Rbtree L_RBTREE; +typedef struct L_Rbtree L_AMAP; /* hide underlying implementation for map */ +typedef struct L_Rbtree L_ASET; /* hide underlying implementation for set */ + +struct L_Rbtree_Node { + union Rb_Type key; + union Rb_Type value; + struct L_Rbtree_Node *left; + struct L_Rbtree_Node *right; + struct L_Rbtree_Node *parent; + l_int32 color; +}; +typedef struct L_Rbtree_Node L_RBTREE_NODE; +typedef struct L_Rbtree_Node L_AMAP_NODE; /* hide tree implementation */ +typedef struct L_Rbtree_Node L_ASET_NODE; /* hide tree implementation */ + + +#endif /* LEPTONICA_RBTREE_H */ diff --git a/third_party/leptonica/uos/amd64/include/leptonica/readbarcode.h b/third_party/leptonica/uos/amd64/include/leptonica/readbarcode.h new file mode 100644 index 00000000..358ff4e5 --- /dev/null +++ b/third_party/leptonica/uos/amd64/include/leptonica/readbarcode.h @@ -0,0 +1,239 @@ +/*====================================================================* + - Copyright (C) 2001 Leptonica. All rights reserved. + - + - Redistribution and use in source and binary forms, with or without + - modification, are permitted provided that the following conditions + - are met: + - 1. Redistributions of source code must retain the above copyright + - notice, this list of conditions and the following disclaimer. + - 2. Redistributions in binary form must reproduce the above + - copyright notice, this list of conditions and the following + - disclaimer in the documentation and/or other materials + - provided with the distribution. + - + - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ANY + - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *====================================================================*/ + +#ifndef LEPTONICA_READBARCODE_H +#define LEPTONICA_READBARCODE_H + + /* ----------------------------------------------------------------- * + * Flags for method of extracting barcode widths * + * ----------------------------------------------------------------- */ + +/*! Barcode Method */ +enum { + L_USE_WIDTHS = 1, /*!< use histogram of barcode widths */ + L_USE_WINDOWS = 2 /*!< find best window for decoding transitions */ +}; + + /* ----------------------------------------------------------------- * + * Flags for barcode formats * + * These are used both to identify a barcode format and to identify * + * the decoding method to use on a barcode. * + * ----------------------------------------------------------------- */ + +/*! Barcode Format */ +enum { + L_BF_UNKNOWN = 0, /*!< unknown format */ + L_BF_ANY = 1, /*!< try decoding with all known formats */ + L_BF_CODE128 = 2, /*!< decode with Code128 format */ + L_BF_EAN8 = 3, /*!< decode with EAN8 format */ + L_BF_EAN13 = 4, /*!< decode with EAN13 format */ + L_BF_CODE2OF5 = 5, /*!< decode with Code 2 of 5 format */ + L_BF_CODEI2OF5 = 6, /*!< decode with Interleaved 2 of 5 format */ + L_BF_CODE39 = 7, /*!< decode with Code39 format */ + L_BF_CODE93 = 8, /*!< decode with Code93 format */ + L_BF_CODABAR = 9, /*!< decode with Code93 format */ + L_BF_UPCA = 10 /*!< decode with UPC A format */ +}; + + /* ----------------------------------------------------------------- * + * Currently supported formats * + * Update these arrays as new formats are added. * + * ----------------------------------------------------------------- */ + +/*! Currently supported formats */ +static const l_int32 SupportedBarcodeFormat[] = { + L_BF_CODE2OF5, + L_BF_CODEI2OF5, + L_BF_CODE93, + L_BF_CODE39, + L_BF_CODABAR, + L_BF_UPCA, + L_BF_EAN13 +}; + +/*! Currently supported format names */ +static const char *SupportedBarcodeFormatName[] = { + "Code2of5", + "CodeI2of5", + "Code93", + "Code39", + "Codabar", + "Upca", + "Ean13" +}; +static const l_int32 NumSupportedBarcodeFormats = 7; /*!< Number of formats */ + + + /* ----------------------------------------------------------------- * + * Code 2 of 5 symbology * + * ----------------------------------------------------------------- */ +static const char *Code2of5[] = { + "111121211", "211111112", "112111112", "212111111", /* 0 - 3 */ + "111121112", "211121111", "112121111", "111111212", /* 4 - 7 */ + "211111211", "112111211", /* 8 - 9 */ + "21211", "21112" /* Start, Stop */ +}; + +static const l_int32 C25_START = 10; +static const l_int32 C25_STOP = 11; + + + /* ----------------------------------------------------------------- * + * Code Interleaved 2 of 5 symbology * + * ----------------------------------------------------------------- */ +static const char *CodeI2of5[] = { + "11221", "21112", "12112", "22111", "11212", /* 0 - 4 */ + "21211", "12211", "11122", "21121", "12121", /* 5 - 9 */ + "1111", "211" /* start, stop */ +}; + +static const l_int32 CI25_START = 10; +static const l_int32 CI25_STOP = 11; + + + /* ----------------------------------------------------------------- * + * Code 93 symbology * + * ----------------------------------------------------------------- */ +static const char *Code93[] = { + "131112", "111213", "111312", "111411", "121113", /* 0: 0 - 4 */ + "121212", "121311", "111114", "131211", "141111", /* 5: 5 - 9 */ + "211113", "211212", "211311", "221112", "221211", /* 10: A - E */ + "231111", "112113", "112212", "112311", "122112", /* 15: F - J */ + "132111", "111123", "111222", "111321", "121122", /* 20: K - O */ + "131121", "212112", "212211", "211122", "211221", /* 25: P - T */ + "221121", "222111", "112122", "112221", "122121", /* 30: U - Y */ + "123111", "121131", "311112", "311211", "321111", /* 35: Z,-,.,SP,$ */ + "112131", "113121", "211131", "131221", "312111", /* 40: /,+,%,($),(%) */ + "311121", "122211", "111141" /* 45: (/),(+), Start */ +}; + + /* Use "[]{}#" to represent special codes 43-47 */ +static const char Code93Val[] = + "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%[]{}#"; + +static const l_int32 C93_START = 47; +static const l_int32 C93_STOP = 47; + + + /* ----------------------------------------------------------------- * + * Code 39 symbology * + * ----------------------------------------------------------------- */ +static const char *Code39[] = { + "111221211", "211211112", "112211112", "212211111", /* 0: 0 - 3 */ + "111221112", "211221111", "112221111", "111211212", /* 4: 4 - 7 */ + "211211211", "112211211", "211112112", "112112112", /* 8: 8 - B */ + "212112111", "111122112", "211122111", "112122111", /* 12: C - F */ + "111112212", "211112211", "112112211", "111122211", /* 16: G - J */ + "211111122", "112111122", "212111121", "111121122", /* 20: K - N */ + "211121121", "112121121", "111111222", "211111221", /* 24: O - R */ + "112111221", "111121221", "221111112", "122111112", /* 28: S - V */ + "222111111", "121121112", "221121111", "122121111", /* 32: W - Z */ + "121111212", "221111211", "122111211", "121212111", /* 36: -,.,SP,$ */ + "121211121", "121112121", "111212121", "121121211" /* 40: /,+,%,* */ +}; + + /* Use "*" to represent the Start and Stop codes (43) */ +static const char Code39Val[] = + "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%*"; + +static const l_int32 C39_START = 43; +static const l_int32 C39_STOP = 43; + + + /* ----------------------------------------------------------------- * + * Codabar symbology * + * ----------------------------------------------------------------- */ +static const char *Codabar[] = { + "1111122", "1111221", "1112112", "2211111", "1121121", /* 0: 0 - 4 */ + "2111121", "1211112", "1211211", "1221111", "2112111", /* 5: 5 - 9 */ + "1112211", "1122111", "2111212", "2121112", "2121211", /* 10: -,$,:,/,. */ + "1121212", "1122121", "1212112", "1112122", "1112221" /* 15: +,A,B,C,D */ +}; + + /* Ascii representations for codes 16-19: (A or T), (B or N), (C or *), + * (D or E). These are used in pairs for the Start and Stop codes. */ +static const char CodabarVal[] = "0123456789-$:/.+ABCD"; + + + /* ----------------------------------------------------------------- * + * UPC-A symbology * + * ----------------------------------------------------------------- */ +static const char *Upca[] = { + "3211", "2221", "2122", "1411", "1132", /* 0: 0 - 4 */ + "1231", "1114", "1312", "1213", "3112", /* 5: 5 - 9 */ + "111", "111", "11111" /* 10: Start, Stop, Mid */ +}; + +static const l_int32 UPCA_START = 10; +static const l_int32 UPCA_STOP = 11; +static const l_int32 UPCA_MID = 12; + + + /* ----------------------------------------------------------------- * + * Code128 symbology * + * ----------------------------------------------------------------- */ +static const char *Code128[] = { + "212222", "222122", "222221", "121223", "121322", /* 0 - 4 */ + "131222", "122213", "122312", "132212", "221213", /* 5 - 9 */ + "221312", "231212", "112232", "122132", "122231", /* 10 - 14 */ + "113222", "123122", "123221", "223211", "221132", /* 15 - 19 */ + "221231", "213212", "223112", "312131", "311222", /* 20 - 24 */ + "321122", "321221", "312212", "322112", "322211", /* 25 - 29 */ + "212123", "212321", "232121", "111323", "131123", /* 30 - 34 */ + "131321", "112313", "132113", "132311", "211313", /* 35 - 39 */ + "231113", "231311", "112133", "112331", "132131", /* 40 - 44 */ + "113123", "113321", "133121", "313121", "211331", /* 45 - 49 */ + "231131", "213113", "213311", "213131", "311123", /* 50 - 54 */ + "311321", "331121", "312113", "312311", "332111", /* 55 - 59 */ + "314111", "221411", "431111", "111224", "111422", /* 60 - 64 */ + "121124", "121421", "141122", "141221", "112214", /* 65 - 69 */ + "112412", "122114", "122411", "142112", "142211", /* 70 - 74 */ + "241211", "221114", "413111", "241112", "134111", /* 75 - 79 */ + "111242", "121142", "121241", "114212", "124112", /* 80 - 84 */ + "124211", "411212", "421112", "421211", "212141", /* 85 - 89 */ + "214121", "412121", "111143", "111341", "131141", /* 90 - 94 */ + "114113", "114311", "411113", "411311", "113141", /* 95 - 99 */ + "114131", "311141", "411131", "211412", "211214", /* 100 - 104 */ + "211232", "2331112" /* 105 - 106 */ +}; + +static const l_int32 C128_FUN_3 = 96; /* in A or B only; in C it is 96 */ +static const l_int32 C128_FUNC_2 = 97; /* in A or B only; in C it is 97 */ +static const l_int32 C128_SHIFT = 98; /* in A or B only; in C it is 98 */ +static const l_int32 C128_GOTO_C = 99; /* in A or B only; in C it is 99 */ +static const l_int32 C128_GOTO_B = 100; +static const l_int32 C128_GOTO_A = 101; +static const l_int32 C128_FUNC_1 = 102; +static const l_int32 C128_START_A = 103; +static const l_int32 C128_START_B = 104; +static const l_int32 C128_START_C = 105; +static const l_int32 C128_STOP = 106; + /* code 128 symbols are 11 units */ +static const l_int32 C128_SYMBOL_WIDTH = 11; + + + +#endif /* LEPTONICA_READBARCODE_H */ diff --git a/third_party/leptonica/uos/amd64/include/leptonica/recog.h b/third_party/leptonica/uos/amd64/include/leptonica/recog.h new file mode 100644 index 00000000..44e6aa18 --- /dev/null +++ b/third_party/leptonica/uos/amd64/include/leptonica/recog.h @@ -0,0 +1,264 @@ +/*====================================================================* + - Copyright (C) 2001 Leptonica. All rights reserved. + - + - Redistribution and use in source and binary forms, with or without + - modification, are permitted provided that the following conditions + - are met: + - 1. Redistributions of source code must retain the above copyright + - notice, this list of conditions and the following disclaimer. + - 2. Redistributions in binary form must reproduce the above + - copyright notice, this list of conditions and the following + - disclaimer in the documentation and/or other materials + - provided with the distribution. + - + - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ANY + - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *====================================================================*/ + +#ifndef LEPTONICA_RECOG_H +#define LEPTONICA_RECOG_H + +/*! + * \file recog.h + * + *
+ * This is a simple utility for training and recognizing individual + * machine-printed text characters. It is designed to be adapted + * to a particular set of character images; e.g., from a book. + * + * There are two methods of training the recognizer. In the most + * simple, a set of bitmaps has been labeled by some means, such + * a generic OCR program. This is input either one template at a time + * or as a pixa of templates, to a function that creates a recog. + * If in a pixa, the text string label must be embedded in the + * text field of each pix. + * + * If labeled data is not available, we start with a bootstrap + * recognizer (BSR) that has labeled data from a variety of sources. + * These images are scaled, typically to a fixed height, and then + * fed similarly scaled unlabeled images from the source (e.g., book), + * and the BSR attempts to identify them. All images that have + * a high enough correlation score with one of the templates in the + * BSR are emitted in a pixa, which now holds unscaled and labeled + * templates from the source. This is the generator for a book adapted + * recognizer (BAR). + * + * The pixa should always be thought of as the primary structure. + * It is the generator for the recog, because a recog is built + * from a pixa of unscaled images. + * + * New image templates can be added to a recog as long as it is + * in training mode. Once training is finished, to add templates + * it is necessary to extract the generating pixa, add templates + * to that pixa, and make a new recog. Similarly, we do not + * join two recog; instead, we simply join their generating pixa, + * and make a recog from that. + * + * To remove outliers from a pixa of labeled pix, make a recog, + * determine the outliers, and generate a new pixa with the + * outliers removed. The outliers are determined by building + * special templates for each character set that are scaled averages + * of the individual templates. Then a correlation score is found + * between each template and the averaged templates. There are + * two implementations; outliers are determined as either: + * (1) a template having a correlation score with its class average + * that is below a threshold, or + * (2) a template having a correlation score with its class average + * that is smaller than the correlation score with the average + * of another class. + * Outliers are removed from the generating pixa. Scaled averaging + * is only performed for determining outliers and for splitting + * characters; it is never used in a trained recognizer for identifying + * unlabeled samples. + * + * Two methods using averaged templates are provided for splitting + * touching characters: + * (1) greedy matching + * (2) document image decoding (DID) + * The DID method is the default. It is about 5x faster and + * possibly more accurate. + * + * Once a BAR has been made, unlabeled sample images are identified + * by finding the individual template in the BAR with highest + * correlation. The input images and images in the BAR can be + * represented in two ways: + * (1) as scanned, binarized to 1 bpp + * (2) as a width-normalized outline formed by thinning to a + * skeleton and then dilating by a fixed amount. + * + * The recog can be serialized to file and read back. The serialized + * version holds the templates used for correlation (which may have + * been modified by scaling and turning into lines from the unscaled + * templates), plus, for arbitrary character sets, the UTF8 + * representation and the lookup table mapping from the character + * representation to index. + * + * Why do we not use averaged templates for recognition? + * Letterforms can take on significantly different shapes (eg., + * the letters 'a' and 'g'), and it makes no sense to average these. + * The previous version of this utility allowed multiple recognizers + * to exist, but this is an unnecessary complication if recognition + * is done on all samples instead of on averages. + *+ */ + +#define RECOG_VERSION_NUMBER 2 + +struct L_Recog { + l_int32 scalew; /*!< scale all examples to this width; */ + /*!< use 0 prevent horizontal scaling */ + l_int32 scaleh; /*!< scale all examples to this height; */ + /*!< use 0 prevent vertical scaling */ + l_int32 linew; /*!< use a value > 0 to convert the bitmap */ + /*!< to lines of fixed width; 0 to skip */ + l_int32 templ_use; /*!< template use: use either the average */ + /*!< or all temmplates (L_USE_AVERAGE or */ + /*!< L_USE_ALL) */ + l_int32 maxarraysize; /*!< initialize container arrays to this */ + l_int32 setsize; /*!< size of character set */ + l_int32 threshold; /*!< for binarizing if depth > 1 */ + l_int32 maxyshift; /*!< vertical jiggle on nominal centroid */ + /*!< alignment; typically 0 or 1 */ + l_int32 charset_type; /*!< one of L_ARABIC_NUMERALS, etc. */ + l_int32 charset_size; /*!< expected number of classes in charset */ + l_int32 min_nopad; /*!< min number of samples without padding */ + l_int32 num_samples; /*!< number of training samples */ + l_int32 minwidth_u; /*!< min width averaged unscaled templates */ + l_int32 maxwidth_u; /*!< max width averaged unscaled templates */ + l_int32 minheight_u; /*!< min height averaged unscaled templates */ + l_int32 maxheight_u; /*!< max height averaged unscaled templates */ + l_int32 minwidth; /*!< min width averaged scaled templates */ + l_int32 maxwidth; /*!< max width averaged scaled templates */ + l_int32 ave_done; /*!< set to 1 when averaged bitmaps are made */ + l_int32 train_done; /*!< set to 1 when training is complete or */ + /*!< identification has started */ + l_float32 max_wh_ratio; /*!< max width/height ratio to split */ + l_float32 max_ht_ratio; /*!< max of max/min template height ratio */ + l_int32 min_splitw; /*!< min component width kept in splitting */ + l_int32 max_splith; /*!< max component height kept in splitting */ + struct Sarray *sa_text; /*!< text array for arbitrary char set */ + struct L_Dna *dna_tochar; /*!< index-to-char lut for arbitrary charset */ + l_int32 *centtab; /*!< table for finding centroids */ + l_int32 *sumtab; /*!< table for finding pixel sums */ + struct Pixaa *pixaa_u; /*!< all unscaled templates for each class */ + struct Ptaa *ptaa_u; /*!< centroids of all unscaled templates */ + struct Numaa *naasum_u; /*!< area of all unscaled templates */ + struct Pixaa *pixaa; /*!< all (scaled) templates for each class */ + struct Ptaa *ptaa; /*!< centroids of all (scaledl) templates */ + struct Numaa *naasum; /*!< area of all (scaled) templates */ + struct Pixa *pixa_u; /*!< averaged unscaled templates per class */ + struct Pta *pta_u; /*!< centroids of unscaled ave. templates */ + struct Numa *nasum_u; /*!< area of unscaled averaged templates */ + struct Pixa *pixa; /*!< averaged (scaled) templates per class */ + struct Pta *pta; /*!< centroids of (scaled) ave. templates */ + struct Numa *nasum; /*!< area of (scaled) averaged templates */ + struct Pixa *pixa_tr; /*!< all input training images */ + struct Pixa *pixadb_ave; /*!< unscaled and scaled averaged bitmaps */ + struct Pixa *pixa_id; /*!< input images for identifying */ + struct Pix *pixdb_ave; /*!< debug: best match of input against ave. */ + struct Pix *pixdb_range; /*!< debug: best matches within range */ + struct Pixa *pixadb_boot; /*!< debug: bootstrap training results */ + struct Pixa *pixadb_split; /*!< debug: splitting results */ + struct L_Bmf *bmf; /*!< bmf fonts */ + l_int32 bmf_size; /*!< font size of bmf; default is 6 pt */ + struct L_Rdid *did; /*!< temp data used for image decoding */ + struct L_Rch *rch; /*!< temp data used for holding best char */ + struct L_Rcha *rcha; /*!< temp data used for array of best chars */ +}; +typedef struct L_Recog L_RECOG; + +/*! + * Data returned from correlation matching on a single character + */ +struct L_Rch { + l_int32 index; /*!< index of best template */ + l_float32 score; /*!< correlation score of best template */ + char *text; /*!< character string of best template */ + l_int32 sample; /*!< index of best sample (within the best */ + /*!< template class, if all samples are used) */ + l_int32 xloc; /*!< x-location of template (delx + shiftx) */ + l_int32 yloc; /*!< y-location of template (dely + shifty) */ + l_int32 width; /*!< width of best template */ +}; +typedef struct L_Rch L_RCH; + +/*! + * Data returned from correlation matching on an array of characters + */ +struct L_Rcha { + struct Numa *naindex; /*!< indices of best templates */ + struct Numa *nascore; /*!< correlation scores of best templates */ + struct Sarray *satext; /*!< character strings of best templates */ + struct Numa *nasample; /*!< indices of best samples */ + struct Numa *naxloc; /*!< x-locations of templates (delx + shiftx) */ + struct Numa *nayloc; /*!< y-locations of templates (dely + shifty) */ + struct Numa *nawidth; /*!< widths of best templates */ +}; +typedef struct L_Rcha L_RCHA; + +/*! + * Data used for decoding a line of characters. + */ +struct L_Rdid { + struct Pix *pixs; /*!< clone of pix to be decoded */ + l_int32 **counta; /*!< count array for each averaged template */ + l_int32 **delya; /*!< best y-shift array per average template */ + l_int32 narray; /*!< number of averaged templates */ + l_int32 size; /*!< size of count array (width of pixs) */ + l_int32 *setwidth; /*!< setwidths for each template */ + struct Numa *nasum; /*!< pixel count in pixs by column */ + struct Numa *namoment; /*!< first moment of pixels in pixs by cols */ + l_int32 fullarrays; /*!< 1 if full arrays are made; 0 otherwise */ + l_float32 *beta; /*!< channel coeffs for template fg term */ + l_float32 *gamma; /*!< channel coeffs for bit-and term */ + l_float32 *trellisscore; /*!< score on trellis */ + l_int32 *trellistempl; /*!< template on trellis (for backtrack) */ + struct Numa *natempl; /*!< indices of best path templates */ + struct Numa *naxloc; /*!< x locations of best path templates */ + struct Numa *nadely; /*!< y locations of best path templates */ + struct Numa *nawidth; /*!< widths of best path templates */ + struct Boxa *boxa; /*!< Viterbi result for splitting input pixs */ + struct Numa *nascore; /*!< correlation scores: best path templates */ + struct Numa *natempl_r; /*!< indices of best rescored templates */ + struct Numa *nasample_r; /*!< samples of best scored templates */ + struct Numa *naxloc_r; /*!< x locations of best rescoredtemplates */ + struct Numa *nadely_r; /*!< y locations of best rescoredtemplates */ + struct Numa *nawidth_r; /*!< widths of best rescoredtemplates */ + struct Numa *nascore_r; /*!< correlation scores: rescored templates */ +}; +typedef struct L_Rdid L_RDID; + + +/*-------------------------------------------------------------------------* + * Flags for describing limited character sets * + *-------------------------------------------------------------------------*/ +/*! Character Set */ +enum { + L_UNKNOWN = 0, /*!< character set type is not specified */ + L_ARABIC_NUMERALS = 1, /*!< 10 digits */ + L_LC_ROMAN_NUMERALS = 2, /*!< 7 lower-case letters (i,v,x,l,c,d,m) */ + L_UC_ROMAN_NUMERALS = 3, /*!< 7 upper-case letters (I,V,X,L,C,D,M) */ + L_LC_ALPHA = 4, /*!< 26 lower-case letters */ + L_UC_ALPHA = 5 /*!< 26 upper-case letters */ +}; + +/*-------------------------------------------------------------------------* + * Flags for selecting between using average and all templates: * + * recog->templ_use * + *-------------------------------------------------------------------------*/ +/*! Template Select */ +enum { + L_USE_ALL_TEMPLATES = 0, /*!< use all templates; default */ + L_USE_AVERAGE_TEMPLATES = 1 /*!< use average templates; special cases */ +}; + +#endif /* LEPTONICA_RECOG_H */ diff --git a/third_party/leptonica/uos/amd64/include/leptonica/regutils.h b/third_party/leptonica/uos/amd64/include/leptonica/regutils.h new file mode 100644 index 00000000..2f1d5e4a --- /dev/null +++ b/third_party/leptonica/uos/amd64/include/leptonica/regutils.h @@ -0,0 +1,141 @@ +/*====================================================================* + - Copyright (C) 2001 Leptonica. All rights reserved. + - + - Redistribution and use in source and binary forms, with or without + - modification, are permitted provided that the following conditions + - are met: + - 1. Redistributions of source code must retain the above copyright + - notice, this list of conditions and the following disclaimer. + - 2. Redistributions in binary form must reproduce the above + - copyright notice, this list of conditions and the following + - disclaimer in the documentation and/or other materials + - provided with the distribution. + - + - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ANY + - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *====================================================================*/ + +#ifndef LEPTONICA_REGUTILS_H +#define LEPTONICA_REGUTILS_H + +/*! + * \file regutils.h + * + *
+ * Contains this regression test parameter packaging struct + * struct L_RegParams + * + * The regression test utility allows you to write regression tests + * that compare results with existing "golden files" and with + * compiled in data. + * + * Regression tests can be called in three ways. + * For example, for distance_reg: + * + * Case 1: distance_reg [compare] + * This runs the test against the set of golden files. It + * appends to 'outfile.txt' either "SUCCESS" or "FAILURE", + * as well as the details of any parts of the test that failed. + * It writes to a temporary file stream (fp). + * Using 'compare' on the command line is optional. + * + * Case 2: distance_reg generate + * This generates golden files in /tmp for the reg test. + * + * Case 3: distance_reg display + * This runs the test but makes no comparison of the output + * against the set of golden files. In addition, this displays + * images and plots that are specified in the test under + * control of the display variable. Display is enabled only + * for this case. + * + * Regression tests follow the pattern given below. Tests are + * automatically numbered sequentially, and it is convenient to + * comment each with a number to keep track (for comparison tests + * and for debugging). In an actual case, comparisons of pix and + * of files can occur in any order. We give a specific order here + * for clarity. + * + * L_REGPARAMS *rp; // holds data required by the test functions + * + * // Setup variables; optionally open stream + * if (regTestSetup(argc, argv, &rp)) + * return 1; + * + * // Test pairs of generated pix for identity. This compares + * // two pix; no golden file is generated. + * regTestComparePix(rp, pix1, pix2); // 0 + * + * // Test pairs of generated pix for similarity. This compares + * // two pix; no golden file is generated. The last arg determines + * // if stats are to be written to stderr. + * regTestCompareSimilarPix(rp, pix1, pix2, 15, 0.001, 0); // 1 + * + * // Generation of+ */ + +/*----------------------------------------------------------------------------* + * Regression test parameter packer * + *----------------------------------------------------------------------------*/ + +/*! Regression test parameter packer */ +struct L_RegParams +{ + FILE *fp; /*!< stream to temporary output file for compare mode */ + char *testname; /*!< name of test, without '_reg' */ + char *tempfile; /*!< name of temp file for compare mode output */ + l_int32 mode; /*!< generate, compare or display */ + l_int32 index; /*!< index into saved files for this test; 0-based */ + l_int32 success; /*!< overall result of the test */ + l_int32 display; /*!< 1 if in display mode; 0 otherwise */ + L_TIMER tstart; /*!< marks beginning of the reg test */ +}; +typedef struct L_RegParams L_REGPARAMS; + + + /*! Running modes for the test */ +/*! Regtest Mode */ +enum { + L_REG_GENERATE = 0, + L_REG_COMPARE = 1, + L_REG_DISPLAY = 2 +}; + + +#endif /* LEPTONICA_REGUTILS_H */ + diff --git a/third_party/leptonica/uos/amd64/include/leptonica/stack.h b/third_party/leptonica/uos/amd64/include/leptonica/stack.h new file mode 100644 index 00000000..4fa61141 --- /dev/null +++ b/third_party/leptonica/uos/amd64/include/leptonica/stack.h @@ -0,0 +1,70 @@ +/*====================================================================* + - Copyright (C) 2001 Leptonica. All rights reserved. + - + - Redistribution and use in source and binary forms, with or without + - modification, are permitted provided that the following conditions + - are met: + - 1. Redistributions of source code must retain the above copyright + - notice, this list of conditions and the following disclaimer. + - 2. Redistributions in binary form must reproduce the above + - copyright notice, this list of conditions and the following + - disclaimer in the documentation and/or other materials + - provided with the distribution. + - + - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ANY + - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *====================================================================*/ + +#ifndef LEPTONICA_STACK_H +#define LEPTONICA_STACK_H + +/*! + * \file stack.h + * + *outputs and testing for identity + * // These files can be anything, of course. + * regTestCheckFile(rp, ); // 2 + * regTestCheckFile(rp, ); // 3 + * + * // Test pairs of output golden files for identity. Here we + * // are comparing golden files 2 and 3. + * regTestCompareFiles(rp, 2, 3); // 4 + * + * // "Write and check". This writes a pix using a canonical + * // formulation for the local filename and either: + * // case 1: generates a golden file + * // case 2: compares the local file with a golden file + * // case 3: generates local files and displays + * // Here we write the pix compressed with png and jpeg, respectively; + * // Then check against the golden file. The internal %index + * // is incremented; it is embedded in the local filename and, + * // if generating, in the golden file as well. + * regTestWritePixAndCheck(rp, pix1, IFF_PNG); // 5 + * regTestWritePixAndCheck(rp, pix2, IFF_JFIF_JPEG); // 6 + * + * // Display if reg test was called in 'display' mode + * pixDisplayWithTitle(pix1, 100, 100, NULL, rp->display); + * + * // Clean up and output result + * regTestCleanup(rp); + *
+ * Expandable pointer stack for arbitrary void* data. + * + * The L_Stack is an array of void * ptrs, onto which arbitrary + * objects can be stored. At any time, the number of + * stored objects is stack->n. The object at the bottom + * of the stack is at array[0]; the object at the top of + * the stack is at array[n-1]. New objects are added + * to the top of the stack, at the first available location, + * which is array[n]. Objects are removed from the top of the + * stack. When an attempt is made to remove an object from an + * empty stack, the result is null. When the stack becomes + * filled, so that n = nalloc, the size is doubled. + * + * The auxiliary stack can be used to store and remove + * objects for re-use. It must be created by a separate + * call to pstackCreate(). [Just imagine the chaos if + * pstackCreate() created the auxiliary stack!] + * pstackDestroy() checks for the auxiliary stack and removes it. + *+ */ + + + /*! Expandable pointer stack for arbitrary void* data. + * Note that array[n] is the first null ptr in the array + */ +struct L_Stack +{ + l_int32 nalloc; /*!< size of ptr array */ + l_int32 n; /*!< number of stored elements */ + void **array; /*!< ptr array */ + struct L_Stack *auxstack; /*!< auxiliary stack */ +}; +typedef struct L_Stack L_STACK; + + +#endif /* LEPTONICA_STACK_H */ + diff --git a/third_party/leptonica/uos/amd64/include/leptonica/stringcode.h b/third_party/leptonica/uos/amd64/include/leptonica/stringcode.h new file mode 100644 index 00000000..4510bdb0 --- /dev/null +++ b/third_party/leptonica/uos/amd64/include/leptonica/stringcode.h @@ -0,0 +1,61 @@ +/*====================================================================* + - Copyright (C) 2001 Leptonica. All rights reserved. + - + - Redistribution and use in source and binary forms, with or without + - modification, are permitted provided that the following conditions + - are met: + - 1. Redistributions of source code must retain the above copyright + - notice, this list of conditions and the following disclaimer. + - 2. Redistributions in binary form must reproduce the above + - copyright notice, this list of conditions and the following + - disclaimer in the documentation and/or other materials + - provided with the distribution. + - + - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ANY + - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *====================================================================*/ + +#ifndef LEPTONICA_STRINGCODE_H +#define LEPTONICA_STRINGCODE_H + +/*! + * \file stringcode.h + * + * Data structure to hold accumulating generated code for storing + * and extracting serializable leptonica objects (e.g., pixa, recog). + * + * Also a flag for selecting a string from the L_GenAssoc struct + * in stringcode. + */ + +struct L_StrCode +{ + l_int32 fileno; /*!< index for function and output file names */ + l_int32 ifunc; /*!< index into struct currently being stored */ + SARRAY *function; /*!< store case code for extraction */ + SARRAY *data; /*!< store base64 encoded data as strings */ + SARRAY *descr; /*!< store line in description table */ + l_int32 n; /*!< number of data strings */ +}; +typedef struct L_StrCode L_STRCODE; + + + /*! Select string in stringcode for a specific serializable data type */ +/*! Stringcode Select */ +enum { + L_STR_TYPE = 0, /*!< typedef for the data type */ + L_STR_NAME = 1, /*!< name of the data type */ + L_STR_READER = 2, /*!< reader to get the data type from file */ + L_STR_MEMREADER = 3 /*!< reader to get the compressed string in memory */ +}; + +#endif /* LEPTONICA_STRINGCODE_H */ diff --git a/third_party/leptonica/uos/amd64/include/leptonica/sudoku.h b/third_party/leptonica/uos/amd64/include/leptonica/sudoku.h new file mode 100644 index 00000000..5abb7cbc --- /dev/null +++ b/third_party/leptonica/uos/amd64/include/leptonica/sudoku.h @@ -0,0 +1,77 @@ +/*====================================================================* + - Copyright (C) 2001 Leptonica. All rights reserved. + - + - Redistribution and use in source and binary forms, with or without + - modification, are permitted provided that the following conditions + - are met: + - 1. Redistributions of source code must retain the above copyright + - notice, this list of conditions and the following disclaimer. + - 2. Redistributions in binary form must reproduce the above + - copyright notice, this list of conditions and the following + - disclaimer in the documentation and/or other materials + - provided with the distribution. + - + - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ANY + - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *====================================================================*/ + +#ifndef SUDOKU_H_INCLUDED +#define SUDOKU_H_INCLUDED + +/*! + * \file sudoku.h + * + *
+ * The L_Sudoku holds all the information of the current state. + * + * The input to sudokuCreate() is a file with any number of lines + * starting with '#', followed by 9 lines consisting of 9 numbers + * in each line. These have the known values and use 0 for the unknowns. + * Blank lines are ignored. + * + * The %locs array holds the indices of the unknowns, numbered + * left-to-right and top-to-bottom from 0 to 80. The array size + * is initialized to %num. %current is the index into the %locs + * array of the current guess: locs[current]. + * + * The %state array is used to determine the validity of each guess. + * It is of size 81, and is initialized by setting the unknowns to 0 + * and the knowns to their input values. + *+ */ + +struct L_Sudoku +{ + l_int32 num; /*!< number of unknowns */ + l_int32 *locs; /*!< location of unknowns */ + l_int32 current; /*!< index into %locs of current location */ + l_int32 *init; /*!< initial state, with 0 representing */ + /*!< the unknowns */ + l_int32 *state; /*!< present state, including inits and */ + /*!< guesses of unknowns up to %current */ + l_int32 nguess; /*!< shows current number of guesses */ + l_int32 finished; /*!< set to 1 when solved */ + l_int32 failure; /*!< set to 1 if no solution is possible */ +}; +typedef struct L_Sudoku L_SUDOKU; + + + /*! For printing out array data */ +/*! Sudoku Output */ +enum { + L_SUDOKU_INIT = 0, + L_SUDOKU_STATE = 1 +}; + +#endif /* SUDOKU_H_INCLUDED */ + + diff --git a/third_party/leptonica/uos/amd64/include/leptonica/watershed.h b/third_party/leptonica/uos/amd64/include/leptonica/watershed.h new file mode 100644 index 00000000..d6b20775 --- /dev/null +++ b/third_party/leptonica/uos/amd64/include/leptonica/watershed.h @@ -0,0 +1,64 @@ +/*====================================================================* + - Copyright (C) 2001 Leptonica. All rights reserved. + - + - Redistribution and use in source and binary forms, with or without + - modification, are permitted provided that the following conditions + - are met: + - 1. Redistributions of source code must retain the above copyright + - notice, this list of conditions and the following disclaimer. + - 2. Redistributions in binary form must reproduce the above + - copyright notice, this list of conditions and the following + - disclaimer in the documentation and/or other materials + - provided with the distribution. + - + - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ANY + - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *====================================================================*/ + +#ifndef LEPTONICA_WATERSHED_H +#define LEPTONICA_WATERSHED_H + +/*! + * \file watershed.h + * + * Simple data structure to hold watershed data. + * All data here is owned by the L_WShed and must be freed. + */ + +/*! Simple data structure to hold watershed data. */ +struct L_WShed +{ + struct Pix *pixs; /*!< clone of input 8 bpp pixs */ + struct Pix *pixm; /*!< clone of input 1 bpp seed (marker) pixm */ + l_int32 mindepth; /*!< minimum depth allowed for a watershed */ + struct Pix *pixlab; /*!< 16 bpp label pix */ + struct Pix *pixt; /*!< scratch pix for computing wshed regions */ + void **lines8; /*!< line ptrs for pixs */ + void **linem1; /*!< line ptrs for pixm */ + void **linelab32; /*!< line ptrs for pixlab */ + void **linet1; /*!< line ptrs for pixt */ + struct Pixa *pixad; /*!< result: 1 bpp pixa of watersheds */ + struct Pta *ptas; /*!< pta of initial seed pixels */ + struct Numa *nasi; /*!< numa of seed indicators; 0 if completed */ + struct Numa *nash; /*!< numa of initial seed heights */ + struct Numa *namh; /*!< numa of initial minima heights */ + struct Numa *nalevels; /*!< result: numa of watershed levels */ + l_int32 nseeds; /*!< number of seeds (markers) */ + l_int32 nother; /*!< number of minima different from seeds */ + l_int32 *lut; /*!< lut for pixel indices */ + struct Numa **links; /*!< back-links into lut, for updates */ + l_int32 arraysize; /*!< size of links array */ + l_int32 debug; /*!< set to 1 for debug output */ +}; +typedef struct L_WShed L_WSHED; + +#endif /* LEPTONICA_WATERSHED_H */ diff --git a/third_party/leptonica/uos/amd64/lib/cmake/leptonica/LeptonicaConfig-version.cmake b/third_party/leptonica/uos/amd64/lib/cmake/leptonica/LeptonicaConfig-version.cmake new file mode 100644 index 00000000..60ed0465 --- /dev/null +++ b/third_party/leptonica/uos/amd64/lib/cmake/leptonica/LeptonicaConfig-version.cmake @@ -0,0 +1,14 @@ +set(Leptonica_VERSION 1.83.0) +set(PACKAGE_VERSION ${Leptonica_VERSION}) + +set(PACKAGE_VERSION_EXACT False) +set(PACKAGE_VERSION_COMPATIBLE False) + +if(PACKAGE_FIND_VERSION VERSION_EQUAL PACKAGE_VERSION) + set(PACKAGE_VERSION_EXACT True) + set(PACKAGE_VERSION_COMPATIBLE True) +endif() + +if(PACKAGE_FIND_VERSION VERSION_LESS PACKAGE_VERSION) + set(PACKAGE_VERSION_COMPATIBLE True) +endif() diff --git a/third_party/leptonica/uos/amd64/lib/cmake/leptonica/LeptonicaConfig.cmake b/third_party/leptonica/uos/amd64/lib/cmake/leptonica/LeptonicaConfig.cmake new file mode 100644 index 00000000..7212d3aa --- /dev/null +++ b/third_party/leptonica/uos/amd64/lib/cmake/leptonica/LeptonicaConfig.cmake @@ -0,0 +1,46 @@ +# =================================================================================== +# The Leptonica CMake configuration file +# +# ** File generated automatically, do not modify ** +# +# Usage from an external project: +# In your CMakeLists.txt, add these lines: +# +# find_package(Leptonica REQUIRED) +# include_directories(${Leptonica_INCLUDE_DIRS}) +# target_link_libraries(MY_TARGET_NAME ${Leptonica_LIBRARIES}) +# +# This file will define the following variables: +# - Leptonica_LIBRARIES : The list of all imported targets for OpenCV modules. +# - Leptonica_INCLUDE_DIRS : The Leptonica include directories. +# - Leptonica_VERSION : The version of this Leptonica build: "1.83.0" +# - Leptonica_VERSION_MAJOR : Major version part of Leptonica_VERSION: "1" +# - Leptonica_VERSION_MINOR : Minor version part of Leptonica_VERSION: "83" +# - Leptonica_VERSION_PATCH : Patch version part of Leptonica_VERSION: "0" +# +# =================================================================================== + +include(${CMAKE_CURRENT_LIST_DIR}/LeptonicaTargets.cmake) + +# ====================================================== +# Version variables: +# ====================================================== + +SET(Leptonica_VERSION 1.83.0) +SET(Leptonica_VERSION_MAJOR 1) +SET(Leptonica_VERSION_MINOR 83) +SET(Leptonica_VERSION_PATCH 0) +SET(Leptonica_FOUND 1) + +# ====================================================== +# Include directories to add to the user project: +# ====================================================== + +# Provide the include directories to the caller +set(Leptonica_INCLUDE_DIRS "/data/home/luoliangyi/sane/code_app/third_party/leptonica/uos/amd64/leptonica-master/build/release/include;/data/home/luoliangyi/sane/code_app/third_party/leptonica/uos/amd64/leptonica-master/build/release/include/leptonica") + +# ==================================================================== +# Link libraries: +# ==================================================================== + +set(Leptonica_LIBRARIES leptonica) diff --git a/third_party/leptonica/uos/amd64/lib/cmake/leptonica/LeptonicaTargets-release.cmake b/third_party/leptonica/uos/amd64/lib/cmake/leptonica/LeptonicaTargets-release.cmake new file mode 100644 index 00000000..6aaca3d9 --- /dev/null +++ b/third_party/leptonica/uos/amd64/lib/cmake/leptonica/LeptonicaTargets-release.cmake @@ -0,0 +1,19 @@ +#---------------------------------------------------------------- +# Generated CMake target import file for configuration "Release". +#---------------------------------------------------------------- + +# Commands may need to know the format version. +set(CMAKE_IMPORT_FILE_VERSION 1) + +# Import target "leptonica" for configuration "Release" +set_property(TARGET leptonica APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE) +set_target_properties(leptonica PROPERTIES + IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "C" + IMPORTED_LOCATION_RELEASE "${_IMPORT_PREFIX}/lib/libleptonica.a" + ) + +list(APPEND _IMPORT_CHECK_TARGETS leptonica ) +list(APPEND _IMPORT_CHECK_FILES_FOR_leptonica "${_IMPORT_PREFIX}/lib/libleptonica.a" ) + +# Commands beyond this point should not need to know the version. +set(CMAKE_IMPORT_FILE_VERSION) diff --git a/third_party/leptonica/uos/amd64/lib/cmake/leptonica/LeptonicaTargets.cmake b/third_party/leptonica/uos/amd64/lib/cmake/leptonica/LeptonicaTargets.cmake new file mode 100644 index 00000000..ef92904b --- /dev/null +++ b/third_party/leptonica/uos/amd64/lib/cmake/leptonica/LeptonicaTargets.cmake @@ -0,0 +1,99 @@ +# Generated by CMake + +if("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" LESS 2.5) + message(FATAL_ERROR "CMake >= 2.6.0 required") +endif() +cmake_policy(PUSH) +cmake_policy(VERSION 2.6) +#---------------------------------------------------------------- +# Generated CMake target import file. +#---------------------------------------------------------------- + +# Commands may need to know the format version. +set(CMAKE_IMPORT_FILE_VERSION 1) + +# Protect against multiple inclusion, which would fail when already imported targets are added once more. +set(_targetsDefined) +set(_targetsNotDefined) +set(_expectedTargets) +foreach(_expectedTarget leptonica) + list(APPEND _expectedTargets ${_expectedTarget}) + if(NOT TARGET ${_expectedTarget}) + list(APPEND _targetsNotDefined ${_expectedTarget}) + endif() + if(TARGET ${_expectedTarget}) + list(APPEND _targetsDefined ${_expectedTarget}) + endif() +endforeach() +if("${_targetsDefined}" STREQUAL "${_expectedTargets}") + unset(_targetsDefined) + unset(_targetsNotDefined) + unset(_expectedTargets) + set(CMAKE_IMPORT_FILE_VERSION) + cmake_policy(POP) + return() +endif() +if(NOT "${_targetsDefined}" STREQUAL "") + message(FATAL_ERROR "Some (but not all) targets in this export set were already defined.\nTargets Defined: ${_targetsDefined}\nTargets not yet defined: ${_targetsNotDefined}\n") +endif() +unset(_targetsDefined) +unset(_targetsNotDefined) +unset(_expectedTargets) + + +# Compute the installation prefix relative to this file. +get_filename_component(_IMPORT_PREFIX "${CMAKE_CURRENT_LIST_FILE}" PATH) +get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH) +get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH) +get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH) +if(_IMPORT_PREFIX STREQUAL "/") + set(_IMPORT_PREFIX "") +endif() + +# Create imported target leptonica +add_library(leptonica STATIC IMPORTED) + +set_target_properties(leptonica PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "/usr/include" + INTERFACE_LINK_LIBRARIES "/usr/lib/x86_64-linux-gnu/libz.so;m" +) + +if(CMAKE_VERSION VERSION_LESS 2.8.12) + message(FATAL_ERROR "This file relies on consumers using CMake 2.8.12 or greater.") +endif() + +# Load information for each installed configuration. +get_filename_component(_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) +file(GLOB CONFIG_FILES "${_DIR}/LeptonicaTargets-*.cmake") +foreach(f ${CONFIG_FILES}) + include(${f}) +endforeach() + +# Cleanup temporary variables. +set(_IMPORT_PREFIX) + +# Loop over all imported files and verify that they actually exist +foreach(target ${_IMPORT_CHECK_TARGETS} ) + foreach(file ${_IMPORT_CHECK_FILES_FOR_${target}} ) + if(NOT EXISTS "${file}" ) + message(FATAL_ERROR "The imported target \"${target}\" references the file + \"${file}\" +but this file does not exist. Possible reasons include: +* The file was deleted, renamed, or moved to another location. +* An install or uninstall procedure did not complete successfully. +* The installation package was faulty and contained + \"${CMAKE_CURRENT_LIST_FILE}\" +but not all the files it references. +") + endif() + endforeach() + unset(_IMPORT_CHECK_FILES_FOR_${target}) +endforeach() +unset(_IMPORT_CHECK_TARGETS) + +# This file does not depend on other imported targets which have +# been exported from the same project but in a separate export set. + +# Commands beyond this point should not need to know the version. +set(CMAKE_IMPORT_FILE_VERSION) +cmake_policy(POP) diff --git a/third_party/leptonica/uos/amd64/lib/libleptonica.a b/third_party/leptonica/uos/amd64/lib/libleptonica.a new file mode 100644 index 0000000000000000000000000000000000000000..8bb7fa0ae32b5ba0befa2470dc00f0144a4cda84 GIT binary patch literal 5100066 zcmeFa4SbwObuauVc7h2mYiOV@brS
E@BzFo!D2@u3n&fqk&X!D!CkV`IHFbPa-l+n}u*VN$A1P#nK~4ke<=$qEC34Mjf8 zSEN4B+%R3KNRR`yfRSj*9jG>84cXY1(p2p-rkT0N3{=Z4N1A3aW>S8lSY44JP84Wxx?53_$Z}=Wv9w#tMr#VQ9q~Q*fLysg5@$ z?sZ-?7%b&z9%hZ19;INANF)y3(5Ove!Dl**X%^26B3LQPTyIb*(ar!bEk;S;k|kRj zot}uI25YEMuC{c{4phf$Oy_)3DC_8ubwLv=O_eN@RD#SwY=l@G6m>`(u3U_$+1xRR z%S?4wDb#gstEE)Rb?8McvzH6pa&^K_uT70YEt-r{SrgvSfHA|hGg@XqnMO(LlfyJu z>68ifVyjRs%Ag)D)e8;L7e18pXQ5GYBOh_U0t3~dLRmV{auXH{YCtjFgmD9v*1IcP zZh*6 =j*4o{ZHF%P#UX-_hJ7z>SFcr3=SerFu^5J4`@ z1=hg#6QMz+QIIpuP193K$U!V+1L&*4IB#f2L4Ig+L4&*aU}>yesQQo$Mq6Pb5@pJ$ zXi%d$H(=oaSCkAtExKSpnM!%0YFN`>Ef(s{X)ZE+urjq?gQ3RO79_3L=ngh~jhJe* zq5u_>n_-L^XQE;xRXJx#B7~_IGuow_)gH27hlA#h)zn`?la1*SDBCFPusLklq>i$3 zTqai3xnaXZ*Mcca9QCkDsx6E$YNIH{0ca2p)|!QK5n8oeSH2r Y`9dxaLjWE zY|Vp|ntL9Mc~lq#6ZM=hJk+caV30OAOb|#59fdG4SpcEbbnVa!a$Bg+;t5Jr=S-iB z!h3f)O=kg4i&}soD}@i08dKBoB{fUaW3`6%iL`o0p^nCydCy>(E~wMnBkr0=)EvMH zc?^)qAtlF!7qPyY%D3_oY>F6HV56d_wF@H%vJ=G(9@l0gDY_UFZr8@j h2o^;n1%cHn8_!gpjaGre87qdmEDXX(ddOY6cf5a&})5t3bDQ>52*>M zF9@BDCFpdhR&^mmP@6IEaH~|u3YSJ3OO2v16yU(Fp~yrAw3vd4NsAdQ`Qf2N0Y=VE zoux&pBZr6DVFOc`M!JQd$tRFC0`b{IIuVa({hGdJ0;67z^EaCQahZnC-$?F_OqS{T z&}|UtCs-2AQbp7rlMok<7Gij983|y|_Dz Mv` z4sFwS7m%w1)sfQ97QJ1~VEbqrNPC%J(Rx0%DVS+kf1&p{zf(M{b~N)jCrLQ+IR`hY z0hZGRs7WzCg}cq(U77{-#J}JSUJFnYgnJf4Fp DEKFdvG_4L8PQo;o z1#^g70@7>?rl+JGD#)rmQMj;`9uGV10S4=37&b$B91~TwMJkd Q*|$z3t^5vU zyJqsSWQxFE30y32JmhQ5Ce~3+@k9ZNS*^4aj;P2@3!u2RCSc(P6R?Oj_Hy|ph^8ws zVYh~Ab+KO1{iw6lNcVswZt5iNrd*+!gP{uJXR-yy78F5|S;nEnouYFP>pws{gb-Cd zOO=S}0vPJXB_XYlBvKo}GC}l}#kUSB!C=H=t%I?TjEk^ZsB1aKLo;jvtN|AXg~nh3 z3oEt61(hkK%KT{}O>|`$OGxoML#-&ncTO{ys3=ZtjLWz`R&C{`g{4JQ(C`jOjCp)x z)VgF$syG5n7)x_k^N0?_&=`UdOk2fj5QcmZg^Z0tKkEY2BqP3|QNmPB|4jtTmg-QN zQGBpmje*oH5~atgCS^cW&JzD8D*;HN5{yRaTS`sV3wdmrP;9!v6_w#c*)(fYX-6!} z)+Wb83^dT(TrXf3%u?M{t13XSpw{3EFa-z);zQNe910PJFRg->Yzdn3eGA=ELA3=8 zUFSTRhKyPDwzopo$+2pKT?U&Kise8OW*u3!d(PLWrW15zO+!svzJb6 q;!SL(OqtufFfAYx9jQf|;;b~3OswSt&5rEzr&U8q zXI4KFD+cl<>d_WFT*5%Cz=j*C0j~zns>zBGXp^Wf Hw}p7cTT2yX+ZKXhw#x>@ojNN{De z)Yx1sPS?w>(ZV8KGW1Qi+^&*?2yL&g;t4E04vE@pIXF+cbkJ~V0?U+EUj_aoHM29# zCQOczno%5XRK?M8#)C!sKy9-?q)mQWP*epVa+w=G-^LLfshLjTm@wnSp-B;u1;d;G zd6+%{leq&(>8bkmi@+(8X?0d=W1^Bo`3ZA5n&?cRosb)D2T6_SJ#biBNrI#|qf8og z86>L6H2x$yR4QEBWHZNf;eep W#@nj(VojyiN|b!H#JEbC!ilnGlTayt zLVW&}i>IseB%yx2V4Bza9&yT&c*)HIxr&AG=IRia4+GULnD tM-<`DG*0M>e80h4F5Q*s+KeSgAQu>mIGkRM(5`j!QWL zGnmGV=h#5VD3Wm~u?SPQR;xTiMDxiUIq _)v8^NY zZGJwES?VI29gAUEu*8Y^Ik2DRM?ruPpGE?Ma@JceH1#kcZTv=g)K-(Eu#nrxbB0(? zZmN~_NQfu0!^K)dIGTjHvoG3r$z)yqYh9fiNQjBOicDjr9fgKnxB8JSrE!yJm$91a z{DCHFmb~%AtWY)ixfv4&=uUMUhQ(FibmKBk{#f7`a?tO+I4W$G6$Yp!($pKm7~` 7^Z{iDL4{M27m_(RQ0+cs!(rb69G&Prg6cc3I6)TgZQZtviSatD^QWu8|Z~S z hG{e=Xb%c`vyPh~?qEYLr;#mwh2n@6! z$DNa{NI+$GLa7WJAMga0L^vgp1a6tGw!v&kd58mB>WYSxz`!hzN!24Lcfc?f;!xBW zdsNzFhpJNDhU-}2A;L4EbuFL^cErS6&p4QtAQ463@D-1bj#UeGC`!aR>X4u(jRf33 zRfk|m5Z$l7ABjQ7=we3`qhU0l=QBN`99&rsN|VgnG+=?c+kuca+o!C;6^F sJ$^!URAMcHaWi5NsV#^jKZ>f@6O4u7Np z^9WlnCOgu!C;SZNa8Z;ASRRvE0l)ivJ*Rbu*du9CBYh>Or~)ySaVk!d%+}RdwO}{s zM{2H0x=X98F2UxEEgme?tRVXe4#G@kPN%}ekz`8<=b~GY>^tHrwAtx8EZYoFw0bz( zSgZN~I(`~FP2|HTxdcIfw@NZ_EZ=>SIj&fw(uQONh?9)qZm|mU*X5>pj}s`;Ge(@@ zW}EbN0pl@6L4Yq0jH5frpAF)ks= V+Xp zQ_TPiC`?T}33~Qg=uj`BDVb)mTweEjlVoGDG+98Z)xhiq$3Yt $AJuP&KZEAllFh|-n{c$XVIeHpEmwWo$mK<&j2+AKyir@L zO>D*0nE~@7ZT#*mS>Fy{GY@ BAZFu}Q?0^us|MNc_9GY-Q3~6*AvZX}!6RN!ggJCHhaEPOGSGr)QIx$^*&o~7 zC}Z)ByBuYnMi8dfv$Y-AhiO5#Fs>M4(EET0VX)k2)EXwPV>PO=3|$koBiTfy*50s} z`nh3`x+jJ`AnXA-%FGZoNpy^Y5X`3u2yiZ_S0p16Z4gjcGqBBNGuq@#KsXU6KrE0~ zN|?dwHCwEO8~sPH21iP`JjN+cKr~hu0I4BrBU`g5Vkci>xoKG<$fNV5#Gp4fAeRu} z934f(BC NYB jKtv3DKz7Ioi9@jfu5NHb zk1Nt$)xuP{s0Iz2 { zfQY4g%y8R{;-ZTitB`zOp-Sd vtz;UwRoB4f87(>iBc3|lYAO~WWRB=C z2{BoLdLXs1JOGOpy;w@*1S4DJ>U0dO=UjVM3-31Id~tq@3y!EyNKv}iDUNqAwjw7F z#B}rSoNlPp3N4|bHyynoPyewMuyD51e1yL$9<>P0r6UKQRLaajg$*#{r9a3hH)J-J z#o=qD*~C0~_92jCMknexoY!pa!uis|6qdjeHv?P3cJNCCOyyBL#exQ+$iT4BI3_ O#Df3ZX5FQ(^UKLnVq2L9nG1^;K hnQVN_5AFw`P|$wIa(WmOr{7TT~iX)btc&b^_3Ib8fWPE?kXFnBk7 z6mfQVBxt)QPz zxf1Av>ea%EM@O^-Nhdb0Iu;VkZGnm06tEZ`=06;B;x-=o)vFToPpENBf%Br;PgLo+ zI1OXn)guPVz 6p=vfsX8no=g3LOY|6GyaliS3w< zaJe|zmSRRm=R{V=a*q<#yG#8;ZD6jV{JO8fHdV4cgvlT$XXQ9WbTWo{y{ZXn9JJPK zd^xPm)pczI<%p1xG>6FI3@qLjR$9-j#o;j5isrDJt18ut+x?6|Wn;Q>@g#)VOs5*L z^Qp$RlqR9Z;SM5RzE-<*8or^)QgmWaB9;IXFa;|Hj5*`ABUtSpm(pJ;@!*KY =LaZd-t2$&%AN4vhB+WYLMCD93{(j IDtTRi)j&og*&C0?4K3@~gn1JXcLtAAb{(OBIXm&%rK12Xam7!dd*Vr 4^p50#BR#Dujtj=3RN=310lvf@T4K=lIr-^dOw;Uo&|H5{L7wq;g?HZYe2qV{?H z?k)NT$CRA+(arC9LEKO$Vz#!?;6Pa9oJyrUiak-i)KkHxp6xS+F| J@= !49v2aVY}Xw23DF{#6ZG1AnI87!D*L~z!> zh;tNteIpLz9Bd(Kyip;EeHILE-ZGTCxL1z!!a>Uf+GhMKW|<2N7sh4dK`b|22--6- zYQM!{S`PfwMLC!vg}E4MxQOJA$5@s^aN!5;0G;1>#GUPL@)}SaYA&y6p~QCdq~I8Y zg~tF=fp!Qh5kVU~rZ0YAYZt?shPBGM9AnL-(13szu+M9e%X+QXW+FQU*X|e7EYQ;_ zI2C{mB@0hnz*s0PnNiP}wUxw&=J=Ex6J(cdGq&wf;$~c71<2oLi>K(uB3v?Pv2c#- z4Q4UVJm6}eeO1mutP=!S_PCZq!np%?IL!e^YIp@jtgKuX?|+ayw@xCkU_z3|xHZ6J z|9oD-Mx-gKSg?&zoQ&>OA&2uV#uCtb=p?S3aqihzSl%=x`RFTmvY^=5%3v)LA{T>- z5E@8a4r3(ZNj|<$ASSl4{IL|1-Hk94kIQ&0dpya Lg)1Z69RAwBBB5Y(+sD~w>)+a%MnZi$N~ z=OkoKNf0HPJ$oAV7t1Q&f^ULf}D${c3Sa&=n(dBW8|xFb2dZ z$vfa-F{4V7N-X9{vZ0iKB+hma3FBP-_QM5v;E^!TWU^6dH{mc9C2UM5=)i^_2Zz1% zC`HfmkeaodB`wyme$U3c(e$GpY_L7XS8+&?sGFoEyxV0VL#;-{8;hc;?hJ^ p3zDZ7m=gsGF5XDN-VR=Vt6hjJQZ;=~CB_T3$N5g+ zp)rp$kdS%y%dMEST58ZT47b)0+y|DN*2vM~e!HvWFdl0YNplb;dk`T~m$yCp-@X$G zQeO`Wmrf@zkZt*rV?()R1*31W23H ECSI=0V5N<9G`$vNeyC;l$2?NYpJ+tD-g;? zR1N>3ikJwhe^no<(Cs{uGlG{bUB; UPi+ae?qyWV17BsM2%{vSgr~o3im4Ui zB7oY%@@NL~@RYtDRw4a 0Lt^sr3(L1Hxn&yGloW%`q&u$)p{O z!BB0KjCeARu???^Q %|ekWszm=~g-Wha zXxLejabB1q%rm60BA02bffqVTG%sNfqOb6t56ooiG3P<579JPklFz_9fb5BM4~w8t zUSf%0aK^~9;OH5%MI+3E8x{P4vg8A5EJONAmNj(c(zWZIA(TXPM$NrVA *?ZL %S$8l z6S^mh
~LdUBgqoeE7Hsu&xWvrHY} zcHcX~v=AJf E>u2oB#;@X;ye|4 z1G9*slYo#=0wj&b)PyCJ*4xfcNU%YyD{PPyY#1dn$hj7;vzQVS5a7rZVx|)#jXntF z_)!+%$3Z|uAC -w_r#)6S|TvW*j_k*aLG|#twYFALeIw`(Dbpxt-wPQAqkG@teuVvKt&V@ zQE_od)`&}hiHQ{t4=v{lyRZlWiHr~gcanvO?-pYvl5GBv2`Km;E02FZIEiN7+b+tU z1)t9u@?_qRvcd%(BJ&X-pfqGLjdRO`*)y699mcT>0J`41rX*+7jOaz_8G~RTx>N7i z#p)`nIQC(HiVom7HX;>2if(jf9Eh#oYAFE%S%sJ%3Ze3gW%l5<4%kS-vXoX0azjg$ z@M4`iR{@aRFY+JEf_zNZc?KUwco7$?Xek4a1E<=SAQ$3=1ZR0OAQEx3Swxvbh8maV zASu#y!CZFTp8%Ohe2kA5iKrOS)mlVkE05HOG;wvs*G7S4#8H 4{0PNKA21A+{3ecUv!M0xM=wH;Y{Y@g;_ hol{wE4oP$5w-#`XommC!13+UCn}~Q+n6oFbrod;(h=n{(zR5ch z9yL;l7S8rnJ4aiKjC3zdXzVK}v>izgEP5!|dG%l}=G+gqVo@#acBZYWdBNFbb#c=? zRNsK2O2z=DTdlLr5sCm2B@6RNjW+3>b-Cb=*Lal4fZFnGuFCL71%)Ayv *8y)k86m~LYBu9f{RY326KKSc0>{uNn$c3szoxzz2Sibw6E4kmJkQVir^g4 zhVH}W$Brr_j6#P=IebZmry;d*0?POVo%p#70T07S-65k8YRO~r(|;&hJ64Yb)W`}* zxCE1Zh(piFl>wPpj9v^DQIp*2?bFs6JfGn{$mGP>ahcE-jAj=_6=`bXSf?~9YNXp9 z(Sl$#3PQwV E7)uTo@VUTh-5V!~sdF|fhqZYW7QEZsc?#Ei3O4l?Sc4Zs} %Vy8O}d#En4&Bh@ctfA2x7`8F6b4vlm9(Z6-R!^c7{2$bb`rqwVlQyx3 zRE5~n5Kt`b5NmlBL>t(2Xpnd?t_@g{%V@$fO-acLkRa__59WT{sE!Ikarrb*p3|v? z^W{*Hb5z-Q%#CD!_K38kaO-*@Wfw+e*ag 4i6O^QL& zbu1^9D66YQtRD?|si$SQefzjz0r4L2yTIe3DLTdjj|upR5c9$cIkAODg>69H<}OM< zFO$T>9) =E8Ad(1mUy*)sp~$ 9`@N8zt%^@@u=hw`G@R)VXZqP;?4a1Qe3wO?J^nuI*thJl#Tpya{gw)-H z(Oc$rrw`=>R%qb*FWG1?VQb(QBFg%7qy=L4l)qZ! v_wsN-tzXfAOtP{Y`r#}!< ksbDiIk_W( O>fG>m=;!=U;1Dp-F)Q1fF{0XB-`1{#)U)p=~Nqc z%hr*aThi04h|g{^doBoabXcc2rmJBbY#dnFvNzAOqSnR(0por%e33iF9gVX Kl(}0j8M*L^-C$hnWx}CXzcO %Hc?B;ci-A2=32WvB||{ zvT`o ;CGlbTX^dVu zWmy;Z6VI|ZWc%oxpMfQyFsiW*IlPJ{GvWQYUK|FOIWn0BcYcx@j8>dTj3=;coT8&M z9aFM2-B60BC@o;Yd}2zHwxvM0yovz4fpPa68XkK0*(0^~a^k-QW2(@Nm%`8XvyRl% zOo-Cu?ME+aw}K >fTcrp@PXJkj%|i@j4&)-tfqAOA)3ZL(?9|KyzC%cIYoJZf)o$1 zsYYX{j$a|*Z^lN5y0dLiquFZ+t8FyfytKfW_s~K-5p$EIPrx|fFHgJk0p%v*I!EG% z*2m;&20*Mt+9^k-2~t3Vz3I?EFkxSatN4AGD;qpdfNQuo4OpE3+|;&QcRGs@Qyojp z*3NH?x|H2aJye~FwN;Y6n#fD8M6xt>${fN?gakx!TrGUEQjaJ@hbYLAh3*} ny zr7B_v9{`a9M7F2pQ1q}E6ivBJX-2yk6j*Bx+ZA5~Xvf3FEDXsuY!7UEP<~2D5G}-= z0_GblK8aWYcCMnTFx-#R%QD7Ag5s?qpVTv&fKQl{yj$JRji7gjiEiZ(dLa(L%|{Pl z%Pp!6$P>X)WfDNkxQ&>;68RKl5k?Y+jw6=SIn|a~4h|FQ>P;yhrc^^K Lq zvF?84mK4_>jhY5wT5i(qDgCF*CuFbz-7AzdnF;0R(9xK_T}3=>49B?eO&v_GGtf{g zEcRsv={O$&TT{3vW7ddpd%)kqXOo8H3=~@fb<*O`0&8b;S5>Ae^9DOHqNy2gm+(h{ zdrPeyrBd~L_`T$3P+Nr|WMVn)5jlYLdAR{NQ(?L6Bq7w-E+8mL^qaXy&M3Itn$|5} z!Br<_et3h)3xj>Efdd1@2-G({>PLZryDm1Jzx1*zMnoVnGKD&PM~VYw7)aD1IEWPE zVx| )9gBYL z1e^zII*taRw1II(oTFEx1SjF(1jN`}TQ%9%U_OD$d;2tuRsR_s;k2?0 z5kP)*08wAO-A@lhFUrkBOnxFDB4(p;Vg}j}NiX1_C@(nkN{g7g_^TVm0@9j#L3y%= z$VO{Pl04z8KprNbf@oN!A;n~h{8cim-y5FV#62B5U+~Hf+`UCr*+PS2+G^kjGh3pe z8=^MVc18(qo@h{|Y9i20#2MmD@d}Bq1Pd-a1=P3 kMgb) zharEx(_EDc(Crdu%?og{wtPt6Bz{>3KnFwN;8BBujnCDp!iVxGh_rxU_o)w%nkC zAHSV0vFkKsdQ2mh2O2X>& Yv`B_{n60i{7$IPlE3tN%ErU0UbrD({` 3N*~h;z?*Br${b}K>tqMg*OaCqg@hsiB{mOX~kzLE H5kHuSV_!X}NNa&k-8oNo0fHGI-fJR5S zg&RZApHcBIsuiMLKFw-+L-In>R8%qWl z-?GZ44bu^v=h-P3DK@kFDY6y1G=H~<| z^@!2m5(%gLbQ+8fuKMG&%^^t3j=HF)soG_Hg1%CQnbNJ4b;68*?TBkSAsV18qfAkz zxvY{NPE}^xXbI2YU~ 4tNWGZAB*@Vd{eeu_G?E`uw79x##Py u;bs!e;E#$xisq25<(7_zXIc~8+s{V+=LqbSAPXcS)$W&%0C zV_pc #$CUYi5VUaJ4?W^Hgm{MlY8B8Yb{Aw0KnBgJoD%XcfmQG+U zhuaYC2AI;vZ&;u*<|iyn2)|(AD##zOaFNY;#w3cZ8J@&RoG5-)BHk&g{iQ`qy8gIi zM8pFsE|kz%j=Nr5%va=rDpnKF^RcbR$G&_RY~vVmbPAa{km_Y>OA|skjtPOBz +NC8inj-iVblc!CZkuu=0H+_+b7|)# *ULo2 z@nys0tcIPXp;792wF3;Q(BNtWH?v_Xj+tz7+E`J{sw QV#MOuW|4AL z8)-HRb7k@w1oOfUj%X>8ID#~YAL+!|KA!^BdkyMVUN4QvKsmSMH?Kx& g-aUqgDeBpY#B2MyjQz|3A 2Q49OFN*gSe( zqK%aPa6=5t>>aQPPGGm4bFgQs?9V<}^)GPNq+^03BTGZU s5yRXAl`-~wJ|%&qom~|$e79{pz$eP2t}Ya zT!@R hM7t;jvMJokUj*MgaWa10**}LJyNs| zzG-9LwajbqbQbJ@HN9YkmXcNtU1hKTS zLAk34jNV-q0=$0nBPELJ#gHbx0zJlwWHo+J4y`3E2gJ>fDKK5Cst=*NC?+ CD-t7xFS%x;WOyI#S1LcnSdi*=1mTRi&$BsxS{ zOM>|~W>EmWW85J!ppEw}BDh-MS;BiyFl(sIfMoibSQrM `2524PhA>1BkLW zP}Y=m1g0ypcmWn!h??yf{ly64wE@tl93VxhCL%dJ&02;-g2;&Cxonzzw4WV-UF#6U znR=f2K|BW?i9_(aWh0Xqgru>~3$KMr^WyX{3{|F^!{rGXu-23qMh5}2ChG$T50@6v zGC~2m^ofD7Uc(SVX6i^;jughW<77>>g;PD;dZROd4|d47w%e}BeYI#;4wP)7Q73$h z#V`zs1m X!$n+x9V%Z2k5e*J9B2Myra+saEbT|( zj{>43dyCH20>mQ}3-rt2xUS*n$gonCRfMUXdqs6jUw&n4n+=Q=bxRKe%|DSP@kBCE zhH>dk)_vGtmRHhPvgiOrC6A5klEs2hWt)>@Gs?@+>Sblr%UQvERJ;_UEYOhMI1(^u z>Tiii%&30FgT$Ln6G_u86JXP+YY I#jP zu8@^^Ue@!jOQO{}K|0gKVdfX7<3RkB#26gND8(-JnH|$g0#ZnTn$u(WnJ)5C6{(9N zpD0@aSSCosGE%b+*D5$Ls$qHnv1G#b9TvsVU4jlbB!3=LBaVMsIo?KstyBs|r^e9< zTBh4WLPuHzF^{M}3DAY1u%{Es5Jb%0bW*xpfSX+-1yBWRVL}*GhS6ADp96Jykkc?P zipy;+&4Lp~*iD(h`OryYwZTi^?co3mt8WVtX>W_@H651X&4@9qh{^>S;z<{AEZ`Z? za-F_mQ>0A6?NA+MG2|WcBUe8Hgl(?zy3DtrFMCZb1l$OLJhNbLQG>=Br64u(j%i9f zO2)WV3}{RSXq7a~kxKBL?`mvZ%L@hmIAODGM#BX}MJdD@f;44BsRM_U7adY;g4D}) zhAGZ;Q4?opn(*So=TmO&3i7x*=*KIF%aEcQC5K71g1MyGV(en<6G@af7b^^o=hk$i z+RvXjhb8Jq^*46CbnM^DK4BBfLEVs{N5gETak_4`Dtu!L>n{iFEl(sM4h<))6KH^p z!+OGm*qE;4Y>4bl(~BH~4o<@rY@x gWMCJI#-tm66Et}5zw6bG!T1QMbphJVvzB0rp-p5 zXGBK5okE*I*j0*WkHI0 MVVlW1S@fv)`tb}K;2uxHAo*&^>9>-N6 z!(+V2A6(TiMl~8^;5bjBp~jS8GjVtq#BIu)ZiHV|IuR%4;H(CF$MBPAR35zZOTWQp6APi7kb7uv~{2#)dL~)YQ_V^awFCX{kA4CoM_gOa #&4Je(>&neDLJF53m1<{B1LH=fMSTC zio;k5m1@mmt&RmOsA`-|<9+a8M-xBGWo$tSTT@UX=qT)}NKjlvO$~2>n3ft~TE&mc zs#>i&9U-OBp$sn6u~gqna6ua!)3XnhfiL5mP-Z8@AYp#B#)+gxQHub4SH5t8Hj;|2 zr6=hYzjE<*9Bs#p4-Vo^IChbA`jFAN`7L4}*f418ud%2JthzqHd^5lw<1BeclUOoL zEIx1_VQDBDqmVQ4Pf-36Y0Y5%6p*GLKp1X*#RCU& ?O|ltn>*W9wshDbr(O!m4 ? r$s>gJ8boL^1E}zAZO9l3t#hZKY4K zWpy9VeCD{Nw|{AR=E<&GvgyTAQkYGz`dfywss6jW@85S@>cF3%Cb`*cI-Q@bq*vyE zv1I(Uw*LLy$NTp^y5}Wx9|2bCv>-EcOILr-Q>nfG9r1iPmkpl?AFu^yd&bf$TmSq> zYMC%6xBv3=s?5xTUDB}3%<nbriaPB)u3^PT6-Pb>I(Bhkb`q2M*$I_x)tgilZ+bmwFH-8~!WGN*(A% zHfd` !=$gJ`-~Fk*Y{<<0UEm+2YRPPWSNK5YQ%eEd9(;-o?LGn) z4gq603&QK9-RS9+Gfy6${^H!nfWh)odv8Zb%kNp7zWj{bEEp`v-G}CW=gH&8$KNaU z7*9QTNO^~D@0weNHcGkm<1_c1(4pW&sYm}j>VM|TKsb(@dTtLie>VIstDMN0nYpox zHO=(gn3{bXi=_yFEkKtFA#ugNL(^Y7`sbO?u;EAlDQbfo9g9;3|Kf+p8yg(m+M>CG zNEwgn7aOmuFj!N2cY*Lg_*5qRw@mm?%7(|5r1p&hoDJ{JKL4K7-s=#K#!dHa`S6%l zua#bo8lUoaOHj9L*8|zE?+H8?-hcs|+PjJQ$Pwwh?jzlgZpR3}1xz_#Iu4SwRx_aU z`uF|I?u*gj<@*lpzJLR4Mfd$Ox+s6-k_dcwFZhU2Hd{X~Ia8-yfwF`B7|)=#LXxvx zPf_M2y}##&)8B^lzOj;Ce)*^R_uapHlC-j2ccYl!iWdVt!t%8oj#8F06fXzLL&{-t zw(AM6oF}KhP0A<>#CvYK{FC|cQ6Sm&t;&UW#uT2^+jL_0H)qzJxaaGT>sTjh-tdN_ z|6uit>+}=%{N=pZ|1Iio)S+7&fIgX K>g(F?`>9j4}|{~i9+j)sL z9^2rA{=RiS1)T|RKKj3+`Ywd_yQuHrzJF=`PCisIn|Z9Ob*`zL)(c!r z9lRK=T!7Bpo00DLiHQIMPU&SKMXR8`TN&5lMX3WdG`PR}(YYna27O`Xu|<21#{0?) zxT9YceMiB{fv${ eH)9t2x7GmlQ||9hKy_UqXv=yI_I+;$ ze;j)j@A-UZ_Iy(HF Vla4r|EUEk{Z1tM$dd~p4+%1dNBBVZ{Zgm>pVTrRU7xz Tapl|Qmyhw z{VFrUc6{6cXFem5AhnlcAy4VCg9U$$1VOX)&SqC0e}CrK4<&d8gHMV^FkJ>@5`G^D zhj%g&gNb@ovSia2N!>^hR;Yw?;2N>14kqJ};+-zeib74q;;4 JAMQp#}dieFeabFUu8S#f_wQ0)HE= z$FDE} u_fO(*3EAJl=RwZg%NenVG{~xtZ@TN?rH- zu3K|Za+#ig-}41(yX+zwVyMM3=)FCEk?nyB*^_!dO@rl`V~;b_Rmh53b>$XS(nI}S z_vTQY<=N9K=`(XZsC{bRHW{Ym8d%nq>jHa#a!GE#VFCcT-2RKwJDIcuc`i!rdyqnl zVd7-%ip$dz;Pu|LtU|zz)IJU|Fzq6YzHOhPF1Au}55hFS_q71EK&SG64t=Ql7WQxV z58`8K1>*B+i^W8anI_i0oI^_Y{d3pS07Y9c*o?)4S;vZ8cvpB6I?#x4c$byU{_yV1 zS02mu+>|=-zq_b 7w9V)cVE#t~>LKTIpq3^zy3I!HtlN{_vk;o#;C6 zZ%}!zNbnt@j#`KH;V%FdJd#Ph<|h94)zqr5Ka%?GJMn!kwMyqJTN9a_#o$np5wesh z%8x|mzAZECf-<)E4~diLPbC%guf`1r=3Yl>M>$kaCdHUaSfBjEWAn++pCZMZ(Y^UR z{Ks50r7wegKyASKNL_P1XZ7_tDB O9*V0DECa~RG+g`J%J=; zW`0JAZlbBZuV(~2&xs{q{TC}+>%Cd$z;6TT)A)j;FEL<=(e^y>N)k{bA!hDVInYdM zy~vxcQ~TBcUFY6^e;$^+m`5-T--}>&KYR=Qn257Ie n?pL}hU^4!tC1x_tn%Vdo zHES@&Q3@txwyOI$&B)88GxBaWz5*53{y}HC2-qy2tGJ-}2xqaVE?Y- WiorfUau7 7QZfx@iz}4#hObHvtTdm%bQ>iyi)CfoBC$6Z#w?| z@WITn<6;p&SsHZ-%Q}3}tQ+>GKWb|b2fO)!72?ni@8odJ(Q-iZFdks`-h&uz2Q~G% z4nQH8(zWuQDWRsfRUxL*&}Kuq@Fv;?Prw 0sK9Oe+P=U zWWw7av$9y3M3l4kB?HA9`FC}$c!SL1P Odb%Bh2IJt~{pu)fmm`?CI$=)cLy9zRhR`ZQ)5EoP&uT zt4JWoD(e!)wgGJ@weJL?VbDby5(9ocjL3fiZMJHCB$(_$(@(bB(%Nm|U0fGRm=n&* zJUGDVXG!KOkN5X{DRtmIG~!0+HvIoMQLXF#=2sqP*M1aCPF?$D%wnrBlOE0$KbPae zC|`W29|PmSr;&_qS(WLzCw1Vj5y^xP%9PjNeg9zi{miki^<$~NJcCKJzvpOb?-fAF zcKvJr>EFxrJg|E@yvNL=w_+ZB7v|B&nqSSr@V+hl2ItXbd6cyzAD&`rt|_dRlVpQU z7zLUInN~78n!3ccf=xyprmyG^9~un5B=hdf4P8AKrH5KC$)fvKa 52~{68t)`5W(K)Q1m?+W=QU4Gk(9PE+xoTSc-7L}#A1wK)cK>R+}!12PQk7) zXgcrA%{(5T%>L}yg0t;MkWA|YM(G1W2(o*5_aV&p*BpYr7@2z+>2);IZ%0=0-?Oh~ z?#m5QME@5%ID9f6-Y{?rf{0*E{)=z{ibLc}QV_i%BaUMy?q2@4=wEsPbDk@N^yjk` z5~z{?Dtu5`0@LU>qXPE)@qC1i!V8G`Awo?ZtYd)Bhd#FriN LY-Hn(3BK1gf)i!j3vr&ir6?SNjuL@kaFn4|&{hpE<&&IPv)nuSdu zGovy9(N!8k53lCzx{jUU5?9OYsZq Vs@8im-zg zyFqY^ 6@%5n`V?G*G<%*FKYkn4F_|9_CE^pd2g z5p&>PYS~NJMp@WUF`NQcemS)Yi<;{nNxf(!y;L%G;Hi|Up6I8=Q !;ay_jj6|_jfYkS7l3f=OFAiteBj~>Y77XC%qkm9b>;$c4|L-5)-Le1`XW8!5u`} zAhq{T84v#*_MOyu=CPHnt gdL2my| z03mPKjIruF2>0B)P*K-L{`nL4{NVzabMKM?y&lCpU`xu)VhxXobiJ{#AoFK}Pd#4s z4`von6lm| S#epInj)k8wq=iwG%1EAwpBWB)l=L}BS{YI?aX7h}kjM+exmS02jB zd1D>L&s%a_5&SUY9Inu^Mhia$4e>)buZ)7mPVTSD{B4rIjUE#6oQ6La*U(T1rqKxH zv=RtucRO)}?ed9vRm1y`vd|dVjdUkCZDJ=yJ_9LIN&8O}pI8N+OS$n20^3$_kWxr< zbJt_W)BP=Wa}I8FD+t0($N}f#m&!~4DS@(UZGx@4V&9S023bHx(}F}rSUSLT3$9Hl zKvMlo;Tt)*!)T}JI}n~kXiltro$m+sp9=)dZw-HD(1~ZR^aO2zE7-1>y@ K$ z!XJi@aIeg|$Ck8CcLI6h?%%>f9eRBo{I8x~xBHdWn1Fkf-msx4 M z9_{$ei*vQ|UC;Mm+Z4-pTNd4F@R{-034&<^UxgsN&D8zhQ!Z$qt}-lvDF)AnM4%kg z=*yLVw+!6K7atQKYwxyjjtyAUk#w3~j2Cevzc2jyKzMKN@ZBdIo;!`wvHZN*#eYwh zc76Tuca{*c>?@CF!mq>00lNzwv=Xv$;4>^GyubUKM_(;=ZWaroV^HJw=CHuc&D?ZC zZsy?=#={e^)?Jx8Z~)jK`-{1mhp>mSdf%hdw>yR|-u;5`)}uF>e#F*rY+V2i4s!^e z1E NgL6Ha2dnJEOz{+(ETi2bq1jmsqx!g}Qll{Z&^_?>?dp!vFC?gx-G zANjk8&x`z}1oEdALhf{6!5>vi=KfsjdIg$k^yvW9ryiNa2H; |^S6jD>!N?EZyt^A#|NII5S)3jRx3C>mv&I0@-1TSoJJ zQ^brtubGb#Zi7SiHXeg~*uj)s_w!uNuR)ti$(_sWO6~g=C}d`y!XC$7)G{;k7((xm z`hFi0dFvamPG5o6yz>>VZjj2~MY<=I;WdK8^01!gVl`1DRX^-()$88!6Y4|#q{0Hu z!&jg-6i`f6ICb-V9J>=ejXXmFmY5#||LNO{Bsd2(u~N7`Mq1ETtD&v7neaM<^9W-e zX14v;q~FUwpOhVLBhgo E{w*C8pzDD+>V-F zk;H`mWYt3BW|`!8x_%vR{gpcS<%LGg-y)HE&fCiQ@Iv@kS^V}TK-5B?+Lnc=y+NoY z_^@)J97|03v01eH5C=L1a5-gO87}T<4z^_&YfI+VBV#nf#q6n7T%7OyWr_>^Z=W{{ zZ(3P !$G@shkuY}4CEd4i#bnOc(Sf$e8iK@e zvs1a#INQ9?IQtE)zt6(c7Q%m?;(PKGK7y%N=98<~7nnD$z~2BzonUHXQaQAK$<5O{ z2E#8v>RL5UCQP?e2u=XU-9Mt%PK0by#4{mwe~dwl=+pN999?1TPp@4E?nbdzaFg?h z?9qOY^};45N>b$~MPmN=5~`D#-6#_Gp3e!^w|qp={m~{G(=37XJ~~{MV4clup4MqB zBvlt8vCV#4zfg` e{_sScYCBD+NHnCaZu8;EU`NDjwr=$OS z-jomKX3j~YPx@d6<*Yku=CNg|ecgcI%zSF^Rs>)-FXg$90irnr{Xx4l<>CE0*2eH| z!aS yeez-j{ _*4s~`Mz>*IWSCuXq&@5j(&CGw}= zpARcI2{C)lAAvWh4EB`6?`LN(<4(V9X{4@wDEB_=I7wam`TXpe`veuDdU>vhlZJ3& zW)L}!BYOy+lRN!$x!H4O6=&`5E7{BGo5bEaRt+t#y1xrB&Khu|IM@A6o`t5+|2;4E zKyK(|A^Wo7&D@Dz#)EuvtV>NJOan_fWiMy;Wn73~fqb%kp2bqTz8l6j#~8?*lMlZ% zFndmy&R@K=& >*od`^pP~C z4!#NT`Q&bn#*mM^Y$4=F=!0})BX#gQ;#rJ)97MJ-DCTZPVzfSu?jM-LUg%Ry#Mm2` z(+M=ImeRmlBJ&YN3jQZEB3HInd!-(@3yJia(^G@7Lgl9?vAl&p)!j-Q8N-f<80)gg zdIuxRgI0qKRe|6L+x!0t9XsUre550@C}zu!zPEjzlYPngv&?aBiRnMiD+}OrgK~l7 z7a*DSUul>F4MBngt&Tvy4iE)>X+MN~Zw3oVq%Yyguh+|_i(NK-&mLWZ&6F$NBLomc zThG)mIfd9Io=QM;%pvaePlB^6SYE&~kQ1jt^lAbA4jAV+) %gh1+rI`Q-ESneUXkfbp1t)vPahObaC;vnC4ijnxlxF zz+9-S>RfoWtiDmFOJ;lFq*9znBkfIpQYhxrlO(${H>=03fJx~ -Gvx{ z6x{VpxC#L1lQHVYgVc}U9xAyCV4j-F^Y6?(U7)*-<`~<_LWZEPxEp#A26~=~YNyC0 zujlD$b?Ih_(#LxRvI*Ozs~wny3z(dwg8UZ%;AG$$6bkE-)Pa9Qh`j+70(FB5Ee3#< z+?Mb9K@LipaU<7&F2#kZ%Ry{a56)iiZuEEm%h8kHJ1}$O;(?y~TE)Koi(fr3yL1JP zaNLr*?#9CpEK6OhEWyz$oVI#2b?s+_m#J$%Dd&5j1P?#B{m_c<>^0 1#5PliL5Ey2II34026?CCtQaD5@ZC*0V-j>7} zYR9?6)CIFWZ+Tt9e3Llqi}l?tIgIaX4zFKw`}FgvXZPJfhS>QSKD6&L9)8Q+1eCik zrdv>>HZvN&daV+@_NHKjCbbIOqF>CGhge{#19 ELeGR{ zBi9M_xs_I~=B@QDuwD{=3GTqoi~k1}|7opT&{y9;t73gMHzFkV0uF;eoWre&TzJ?n zZDEJcy%ws-+8+u3lr}2>g4(OTRQxXJ*@^h5**}ZhZ18Vk7sm}@h@JYhPDYIq^x%KL zZ@%81JAxF0-?4s6skS?&T!a))1&X|6K6MUip84Ap{{Pg;_-}jH_7f&=Wnh&G2{vzT z(DJ<336|kV5oR&bnSTmoC`>rn2EsdJ|45x1RF`K`UB22e3Wxf2oqXf6?r(Z`c=2RG zHVCeKlI8BU7XfD0p$9pS|GjKkg?Ht{hv7-mT7`Nk`cIII(;lb_WfDGTx0eVVgC(cC zC5#fHQ4Id>0xyzs#w=EW&w;R=uakI3?@)fAJmquuA+4gf)jF3K>A!+xyyhS5>QL^{ zcN_jj_WR6zP)9H%ABVD`H%T{%;lI?=X*m8)?!K1XjrlRlP$l5(%#E )B^+Y%q2oDwT~i(v5 ~bH0 z*}1TVS0lBT`>ta0-a^zB;$>3Q=uVK6&G13iMv_rA>!rg2+nyrhvfDb`QGanuu{azR zN*$P`TolK!K*n{K;+Jtp=3#S^Hh1`YCk!0^_6eWj`f1?sznp+9Y1w7E8vrceGTldH z-Wr(Az668s@|Qp*J+x?G=Gda#>{^^7xxOoPUC^Jp?#;QGM;9Hwdr20TWZsuaUAMUF zs*|wpOYgz0#v8f@x}MB;{ZpP^sf*I9F2|L}+odgYJ0V%7YtSQN1M+xlN2#GNC>P-i z^6M8u{*{Fi=}qoF0=019Hz8osJag~jHgUh9b!Zt|g|*Bf+`c#jMX#*~{NdDVZha(m z;h~39+dlU&j&nbZu!)aO%uM#$9)q3^I)P!?}l}%G<{7oNt`7vA>B#%PCKO4|0ca zUJktqiE_~SAFw{fQp}1Cdi)pArEnAg(hV;PEW*R;B$>q$zl$f;k8~eFL%)WGpwm^q zC{I>>0}V#QwxOZFeJ5dP@C~NHfVl?WeAVI?vCX+FpWvek(}!|b9%dlhb<04{=cYf% z5yO!)cc%>h_3)<;gvUIi3v>E8coPbq>5s|yI40+HzJ$%BZ1{PVf0=4ANY|=K&LO&5 zQ@GH00kZLW(m$e9I&g6$L=tg_SSEoPq~i#&Jw8j3J^gMyUHtxIKiG#$!<%mGK5q6< zEf(i#oX&elupes2!+BC4bqH7K1oa+4O>KV2uB6cR9Eq8E5m8LUX8u8B8@gSaA`3>0 z^VHr38-gg;jN>M}4dDwJ=EV9|1O~~moInnx_P$vHU 7oW^+GK^=DvZI=Jb z-n)QDRh@mjGfBV*m o2E~{g5H4yanZQH`OeHER3Ly!Q8j_d`f+C;^>KFr9 zt(R&oURrId#e1!nHh>6NTT!%HFO^o?8UaPT;r;yIwbz>Y&&n+8Ip6c0bDrm%^<*-8 z|JJ+S^{#ha_S$Rj**hG?+EWfzWz^ldY9=DM435HaO@1q%t)C8pn saBrh7< zV &WPWL`t{2JtDH!N}7rlbJPz=c(U1;O>m~~uN%c3c> zI7*I9YJ6nnlU&C#xVB$z#Y)n@WEk$~>-T;zQsy+O{{xg$>LsxdO5=TrjPf^$CvKGM zCpmg`Gg~^m)ND{ycmz#ARk0u(+Hj>r+CU!6LLt2Vj%qJJGr`?HP=m(Na|wFUFzH27 z)2cyu4OA*Wg1fZ3He`f)YL@$?HI#*VN-md;i9Hj$yhbpgKDS`;V_j%WDsfOXD=e+$ z;9^6`;%lUN rc&?x2&W48 zksiv7fnde$NQRMWbKv+*fh$hHPT+Vo1qfVGfE~FIcI!Gk-YIZvU*@{N@~~o9OP+uY zam~S)2FdifTJD^GQ%JB{X8GRz-J%$u*RXUXH{|24sefQ5ipo)j d_+=MUE z>b`yKJdZfcGNzx6U#VdCPag(m; ++L!%RD}~( z>J&-wOSh$L*aMPy_5Iys%g_kS{Aua3lxh0sNnc2s&)2y6LH|UN9nf#&=e? 4F!0liM2b6WR(ZgJhfvi))8 z4_7p*k8gd5_g5*OD#cKJuOGg}0fFwP(2#p8zma=+t~d|d`qxiy;%SB6a|^tFjG+K) z2$+L0EyIU_E!;hY&i??7Mh5~KG9|B!*~yv{DaWy3nHlJL$wynZPUsrqM+ zcjZB4fI-GnV4N;GO9S0 j#} za;gyox_3x2j5)Z^-CL`do7! !-?0;U3b&0YBx~HIVTcy 6eEtC3;?9<;ri zcYl`={r@E&WwW1>3JP z$DgjR(gG_kM03T31#Hd7R@YZU0xL^Agso$+CFAyrOVtL3?1d^0kEU9AtJ=c-qARb% z7KYtEd@!f=hE}vEOmE#!L_r(Ok)Pfv%`(>G %65Y-e^?^B6!=O|Y3{;)~4an)74MutO(EKR(rJBU|{QlIE{W)d&E ziDs(%P`t{ep=b6_k~SHCzG$LG;W@;lbbtT8DckYqXi%x;|B0A^?fx03`~xZFovZ!* za=Q&Y?m1hJIQ )xmm+p8}+=wUe&BgSf3J=2A8v8S*1vn_Ev>2^Br%XYk zUpQsl*B$K%XDmHHuJk0$=~MzaOStqYQJOsMr13U>9Q> V*uk-3U >#fs@*IkCfO+}_yuLna*eM>&^P z-osQ=EvD*UT1vZ>CC {v6p2bJV%n? zbOrZeNS4!2?#;MYA?(ajBbhu9CsX3G5w~38@K7#HcUEHy<fHimcwqQ{dG67jjYm zE?K(?%fgL}g?c~mh +mJJaU7+L2ihwFZAGys1DD_9kwOX<5wP(lY=PkZwOY^ zy%fdG0y%{{tNdHz{kgoi<^&(EY|9aPNkusJzC2|nj5{Q}DaVo{aZf|BckkBl@JKv{ zEb^jyXv{`GZZPQ?vFgg<<33#a0v=T|#lJN)u7By8DtU^W|BdiCfx-Z39*0XS*O z^H=(xlbf`1P@FtD;^6r(n7zoq%n9C;IRaO|Bh3wQ^Hgzg)u{JwU#55kc13z7;Fn-} z UJDkxdpih1Uc7klk9aZ?*1AgePs$4zGOzvAR zRa1F21ypTQKSiEU_B~N6hhtfgDv%S)GII(f+L7L0 zxOw?b$)pD7Nm~|W_J6Kcggy{0NVxXHz*#tRQfqLs1hp$xa%H6V0)GVSOn-xeFa1i^ z2m&jQhj&oN`uuWZ#wx+GMs?}uvbAJq|2`t&UG7lp=qu*|#1DK@q%!RWDH)YVnJ(7K zbz`x#EU>%}hb~Wx3^zE*i@Q?!kQ5DY )Ejlw&qy_pJBwsGtZFVX8Hx0GO;)0%HK&LcEYYh?v<%>)O5oiL;|fHph$rSd zLPVB{mpZCDv+CpO(IOY49I6+pMK3HCVg()ZE
T%V&z$V ztN3Rb%IrbxT!|ft6o_# ;+i^SAmMG54F?d$tR%0*4CrB|yQtXO7z4q%v3wMp&C8-XM zOu#+4oqxtrEC+Wf<58;5MR7k|uwUJkfQ7Z~V@~d!xbMlmB?m_2Y7#EA;J7_F@W@`_ zk$s_9Uuf-~L&JrAvIA{{pWe&&^k6k? pK%qjk7ruhFf0k=CYzQ6yGM9&bn zm11pp$)RwY*O|nx+NIuT*8d;eDwjO}FT@OmJ)g6^53dmkHn(&H>l@_N9`(VNHnm$C zoZYJ4(i3cK57x;WJ@7J(R`1=;?LoX^*&$x9QqR|KoNoVC)$KvN4K1$RCok9wHZ}*3 zY#$$lRr5LR5P8LkM+%i?M`7Q~OIsoW?J10H }zPA1hhRNt91an177gm!wH{kViek z1QZv=O;0ME??PqOJT_{yBr`_gb*b7K$uePqD3z=|Lz0~yufX{OYpZaKGNiG20p8mK zcPOtMkD6~+ugDIfs=b=C%9R|UwIFj(xK!GXE@M639yL!Hs;MvGQsB1v!8v%LR0G~l zDz-N|isVZwU}F$37lR4j%gpDhH01PPJKjF;S%TN7;q8EIgKo@Tbe-3f$=vo@c?(hV zTv%1tfl^Ei7W&%o@^qC4n&deJ`31rJ{QO{He!;mu<2Stdu5o_8*MNg?WhdVJgT~XM zUh)}ilb5-vcjFoPIgL$tr&O>5udMd5&x3d^PJ6HeFC7XNCr30ati#*AgM|gY_W3O> z@F?D|Ry)6)5)@i7Iz_Sg)$1S4ooFE_(+MX?JHbopsJ2PbXiHJTCOdPTMX8lQW7Tly z!)HgSW?7pwy7(GvYm@2?1GLYF7lJj5^L5{s{)d{7_qeOhSdZ6WN?dL8BJp+S{ARho z4Pn55A;Sq$&zUP(H#D_N@(#QkdTy|zC0O60liB&r_g?R$%&j{NLY6%!OdX8rfRdJA zle||E#-SR~epQ<@YVCA&warI&puL{ofV!22+o~lk{R8FNJwZ#(YXWEv@Q#$Uz$>L# z>;)N++C~NCYp(Y-TREG1u}HQx)Z-<*c#UOzz?t39fmb#+2aD7|gqLWlVC9bjD0R{U zC!l%D%R7U$sFK!2!In9yjO{I*ZFLRCAS*r0qMn{YgGp_ra|{A;1?_Eh$_SIKT@M$| z!)wgE{uw;7-Yc`{)D5<%pg>gN-DT2B3da@L=}~TU?zpc`3_>2#9lBi=jUKIYR&O#j ztr$*k!Rsc)%QDn;V(5}K+=lmU>gx5uA?=0A cv!G;)Q^HEz+ U%MEMWYEG+=^2K** <1(aI zZ`P|XUnDR0#JgYBJ8s#&NqA);bVgdl(O!PGsZ-=_Z6-h1lZe-*#syNRk7qYPKNZ#J zPbil XyU+pv$Yt) tw>FxSP=tTaDPV@N} zX8R8swpZpVoQ=xD#lbr67x-<8uRJSzWm &7M4T#X<4( rA>7d(N*;H zqx@O(&dq8)C2L+NYZmg6W65Hj=O-!rU1|3(`1{e6nN|)>dk%f$6tu5XbbFH?l SeYWAqH^;|OEEiyv0|m!@bjTT4rj (Qf|E#p` zta+!v#Hbn?(#oKF;9)d8H1$ECYUo)h Q~Nsnw+)EpLRMj z8Q9^K$zp2CAYCKF_kmmi8xYdvDszgEE >gj%Y=u`*fowE=BeG_VS^d ztB|eZ4$@prDzN>1&87c~e5;l}Q1fw`2c>=xa=b4!_KCbtbED@>#0%f1^&Fz*=V;!i zxtSw&YF@3m(bKK@YOP=FmT)aTqJNpiZ`XX5=0WUBkcaDwe3`}jG%v91lx2L8&$jIR zyXM=po_(<|VJAK!Z>rMx?Mu!3w7e 5n$OZaTYoobZuU*NWUeW8%9trZe(NcrOLK3}=QHVkta*WsFnVM+ zUHp?Gq{~(H6d~OwlhT19-6x~Qz>w~f)}9=0gFQa<7t{Vs>@PJp`{w&MiVw8sKE((2 zuZOiBQ(mJ-U9m#GGVX9t?}rAL`5Onht5obfn<2J0Yks%IpVRy*i@&J&U^OS@s8=;F zWr*! N^p+M|0^P9KO~(Xvxd(Atm2Y7MHt9d>G$W z$rpue%{LK~&Hc3=`4I<)gEb#-arxDl _@j<>b)ORA^ zpKAGPi?7!5^DO>L%~x9d9?gGd@dq?tX7NYW{=jkU4_f|VOa3X%U$yu%nm=vvEovYA z!s36`^6y&wbuGWi;{R0pdk+|i-%)&!?*MCx@}B0!7XL`|K^Fg9^E!)r$IC&!Q!PGN z?GN&;viLB~)j3 y z)8OA!`m-GTU 5#8=@OB5k%)ze$mwfy5sfSwIM80=A z !RZc!Ps4aPZ3< ze5Hfm n{%ZmmU0lt>?Z2kQhO&1><`drp~GQ%K;94xPuos z_*ihUf0dr-tMy^zJIx{AsO7gEAy)c)Y7H3Q%N+8(TE6-yCGM^BV)Jgz3r2cet;J$< zz2V1sT& `LXFVok})w&~+PIbtir{!BG zc>2}aA~stMFY~xs|HI~$ny=RUY(2E!?$G~RE$=J$^r$sEY)b!-a+OW;xLR++<{J(@ z+Z}wDgMX^^XP@lpS8H(C%tZf8<+txS_z@0X?BEp+e!7Ft0T(|6r+RiCsE@;o9r8cX z@@3VYyjp+5rmSJ5D%Uy(-|FE1aPW^Dd>E#%Vt?y2&mOf-ht0#mQ`uAK;2{S;L+dX) z!_%+U=&(7*A-~AMuXb=>ZGCNP$NbvX{5s#vnR7au>t@c(FC0@+JT7T>Y*EtgxTM&k z($O4SJf Eh$V&JG!WZW960)GNTB0Tk&pDVbX4KlIGE)lQfShNQx~SoxEE# zmQ@vwO)A2ek|e9flqLy}Eld&~n{39|(Z#HJ?3g6s(voCVrAdx09h+3Z(t<)?ezZdU zE0C>X`Bx(UM$5l3@~>3>jg^0J7XFV@n?>rsms}+%RB2(k2&y!=wMe#=e3438sMNs8 z;6+NlNa;Zx2~lZ_RH`DS0X`J2G!%OVs XrJ+Qnh2KO{r7cl Ndcn zdpBlIj-FZ`iq1TB(xhpXH8X2M< F>?FL8FB-q#GHmZd>YzXT2-1bZlP>zS>$ViRWsW=>Kocr>QwiuAZa4w3fz@; zT0=W-7gYDMkk!>4N`nX}J5t{n17&B!2$7JxW-40dxB6zcER-9UD&%HBvs2!Jdv99i zH*~ZaPle#O+PMu=YTM8EZkMjEZEWtq4Mr`UbLR;aou*jW6qVJD3zb5~v<->Gy&~pr z7$n6lKMifF4&wJO)wGm1HrIN_sM}Je$!)03b*47XY^+BeBQ11B8XD)$GgWwIYm>%d z+;1tH)9PxQ8p;< S`D zq;6ODM8z|e4XvuCrBwDp&FW6!Bu9Ap$JHovQ{_D1#wh43$IW@?*TGs*o-j>rCW_xI zG%yO (I$jV*XsBf>g@jiZwVB*ok_0Z&NScqE#>!j(afyBE@ZQxydVnjp7 zX}GsriFv&gi9}<(6VXk8f-h{D)>z+AUs*r50b?n~CK1MnFdKI;Cc61F+^OBJ?jDrr zX)UuGnvzq%Q}G V>Ora zkwwI7G{@<`?;_%}G`Hn1&|Ie5hvRdPK94ciUxXixkIDBEY)cUR7vp32DuD>Lo*O)@ zcpkQm{4JW>disbjCiy=T7aNS8aoS$dvxK-={}+2k5|`_H5=4F}K1R<4#Fr6YL7eqJ z?%;nT&Uz+`AqbN1rTCb9FDHH(akG9T@?FHeb?$-of9cTUt+RUatp6OnK4#lv&a3Tw zmuPvr{jAVjvOgRj(|&$JT+*2G-a`3y6MvpKxAV`5b9>lV3`CHx%keS#D~NM>FCotL z_%q_mNYB5Bv-}{e-$;p@e0jtzfIHJ`0Z-lZq6nyecb4uN&2rO-tN$U zDd~}VG5W70K8p18I`sdNc#Py @&-QO7-b3=Q zYHsKIp@V;;x$V!vSRaxgyZ|3#&pw( n%jOjl6WD~nS4iSZu>#jw ea+?4lZ($D!$bLg)pJ*@wH;w7ZN)uI0i;_T0BHMh%kH|ghm*ASOS zSeSA>MEbd0|8VHve+UvIi2tw0$LJYJoX3GN#JOKYG(QG9cz$@U=5~89zaSDWOXeou zM$*srcRKW6< )`() z&h2?8arVQ<#MuvD5obSqUtip?+tm*=x7$g+=5{+7O?(2CcOvQM`hAl)kK5ZdxARRK z4y6b-AEUY0&w832@^_LvkI%m&-UD5xJv>GH8saZ&Zrig%bK{>c^}P2(;yga@(Om53 zel%3ySZeDJYHsU4n)pPrbCl+`{*y@laFN$`P9lB+={d!r=RA^UJq^T9Bt1WJ=vk<_ zUEW^O!}_ly&d2MU9QuDx{O4rPpNRAE=ta`c$D_ANo{vYL5x<7?58e+u2;zU{`w{1U zeK>LM*QXNa !*hHM=Unb7- A#a5e5QjxOnd?9dBefKbnt@jd-g~_<>SRv&80o?@#1{qS5dyp z9sK7Geh+bOZ(kAT`9OA#XQ$Z1{0Ij>m-sTWv(v$^a`0P-vz@ @5K)Nt4NRd)0FE5;$@`& z7Ki@(iL*b~YHpY7ucV*zeS`RD%J-k7pZ&Rq b`TOHh#z=-JCykCh%@yyhWK*g zmBhK F*}Kn>ddrUu$mX8~6bdBba=j(Bt#|#CiUIkmhzfJXUjC z|G6a3_B1-=FVft$=ThQ4zFkiGFGe{`y ENF__&3CPyv;hyr-IZAkGCU< zFF>4WSLF^~L!9kD&%x(8c$ hXFohZ{0h?lq=Rp9@UMyUaePQFlp@&ur9^Wn??w2Sa#c9wf2esHWW|M1KmH+1 zCw?6Ejh=Hg&j7oUcqhrTp2ftECHYGodR7x(O!DiA|BCn); 6hd n84`yBc=kRJB`v&1XN{^uR~-*D*PO?p`WXT-y#|7(Z-A#zfIVEbV> z@$rZ^^?R`9Qjgul?;_6a^GVHZ|Nn*bi~Wnm0ECx_pNM^v@2jMr{r{Fj|3Q)=g4oIS zoTa&K&kB;~_IWdLZqL6Y&hnoSzZH2K`^U?{3_ ez>o%FE%Gl_Hmt#{~OK%DDqnS)>D;MZtw`{9?G+kUv0_#~9sw6_OHKl@?5 zL;owJhyCy-aULh%cIf|* #Ce Z= MuL*m@O_Bixs%VY?_F7J_=+xCwlJ{jqZKMOUt z`$dH0+0IjmM@UbNLr 7UJP*kx&i(xe&22xFYHrupNyK@a36p+qZ_^z5=aC-va|`h>%3#_ PbJhhXuqr-(?Pdm4jcSxozh!HMi}&mw3`Vf%LPT|02%) z?gP#3eD{}=X9V#lpN}7@xh;>MzpG&E9HrNn#uJxAqG=~5k^U=*Pa%0}pGHp&ahY-& zJ!d)ev=Qg>-bkF+f9@cDGwFYf_+sMEIrz)O*O2^f;+*eS#5v#fau7uj|1ZJEl=net zlnA!}H)wAA|5@TyNN4msues=F|8H~X-%WbBUOpp!GU@-?p?{w-5JIr+KU8zu{-cP? zl+)OMtmd};7ZT@s@6z1P_eF>N+Yb5Nnj1TZ>304Z@l(jouSq}qc|VzaBiQyFskyCx z6mdR|;87MT*nYs1GE}hjpH6zD9*zAoh)2PVpKBfZJ4l}OTuhwj3CkRMt|QL%b(e#` zK%D#08^pOEy+fR@mwiP1r&QiSrOIup-?98~;w&E|&i#D?akg_3akle ptIT=Hc_HaKwrXB}R5IV5Ej<{~5yWN4H2yh2b9)@fC(h+6b?|ZruhQJMa|X$C z`@DqsePrjgn%m|2De o6{|pTwF@nvH)?EDXAU?+bRm2}AUgyx$skv!aU&;o;V&XiW{EWEx$H?DF z{D;Ez^G_Zo&hqPtpGNYVG?#L5y}YKm?T4MDhxLC%d>ZLLsvJ8AqM!XgUUOUjLXzj> z=5peEoLxnn<$vzbf3N0gu;*}mo{$ZMhlulW_V=2L{X8BXBti(nc^%_a;yj)=IQYd5 zevjt1f7X#aj~jn-@U0I1hJ*jd!9Q^DL1E>FfyYzLZTpYZT-<&*KF0r}h;#cdB>n9F z8sfJ>k7@tS#M%En#QAu7J#qHuY6pK &&29hW5kCXEjQ-;s`p+l+D9K-}xt;IBB)^#CKO%lP@k6C?BS^V;ettCZTM%dL zEFyk0@e_%&d=+t)uOZIzGl{c&kLKdfGb!I85$qs{{lCY@*tx&vwttS*+| {+YzjB0cq*+wH28 ;+K#fZYL+63?T%u z{~~-$xuz3eOuUnLjQG`>i{C~P|24@!LHq%S{0k2GHyrYxJLLD4MN9-K*OT~|a_#Tn zM>zNb;(s7LPZ0kj@qZKVBmOn >!Ap%=dNh1Br9HI^4mJaqtSwk3qhR@G<_G zuDNOd&mvC3OycKY-^kC=T cW?fhAMB-}uJ2KJ5qTQnE_+|GZaxvl?k z(!=`K5kHsoZzlb0|7#BYJ4p}g|A;t`51)~KwtuKh&Jb+-kJQ}u|0v?4kk0t0P;=Wq zVdA%t{HetGIPw(nwIsit`2EDE$)W>-_0?K&JjfZJbVm4 zUUSj^IPnRZ+kQL8!5c}x)Ym=uNN6R__0_4l?a!Z(JnOlI_=(VK?7z*S=W)$#`!|yw z*1v`LOw#|7L;qV2{U4Ja*8e5(S)|`Diya8IANJGSw*N@Y(~ySsk0M@+IOCr}hyEvs zbGzE4xt;G0lIP>s9*6wiKa^4>)(Nlnc755z<&vhc^Lv_$A1)@INAgl$qvv?y`6OTB z&~r8M4J3aH@f(QWL!8$c9wNSm $YKqG_<`4#3W)y>amH__ z6KDHl#IGUwYaRS&4t|$|-|ygSiEpBOU(?)fSGzPf?b+1tr^IKIo-av1x04^pA{2u7 zZ8JW`Kch9b^F3K}JKrA?uOmHYkbcg$fjIm5C&amb-KM#1&j!tnJx$14!n4GW#l9)m z^Q51TcRPqD^;6C5d KE#U=Z}Qz&b9=m6Nb-C QCp)hp z{ao*NIP^bEdJcyk)2^N%-az`-I`nUK=>He#Vf{OZ&msLEIP|B>Vg!QipYLgI`{!Wd zbCJ%}?_rwT?K7YF&q@AA#JQg?)7-XarRK&SnL|ssp7=cM8+&dh{ajz`9r|A&J>pNJ z|8K;39QeCK|3}1m98ilF&})|~ASbH`cDeQ^&f~yAn%jO}L7e@0tLApTe{{%iA }0;5=C(aYX>R-BIO2`aW$L$x^mF}IIP{-EdbobiCH^DQKii?d z-J$<-(!=_DiJwpUf9%kIn?wIYq(}4*!$-p7#JPR;IrP6s@}eiKwD^3l5obNyNDm)> zcM|7z@|EUx{q8G^UkGXVaJ~l+=XU-B&87WtzG32zA
;uQfM*Htpm=;&Lo9`qz>E zZsMO2XFm^_0U-p@KOY~XCrDg|1jBFE+_v+#Brom3$UjEBnfPYS#XsENKPGw6W6GN@ ziy#PMXA3??|2~?F9xm@uB+q(|BhKx!i1e^Mb;O^ed>1?T&BS>g^_YV{N1Vsi*B$&l z;# MN(*W+a*znJ82A-;h4BM$y5ah@l<@8EmMVgZ8K zc?CYk&hI;TE^+o-p@ZWESSr}%ovyjGD{dz a zkpAmP|HZ^tJM=$HdPM&yt^Wz)ZKP+dL;rikx!woO@)X*Bo2j|f*RSv~^>vYhuOiOl z;SHMG`hTUlT`%_$m$I6CAJ$y#;d #+B91{Y`I`69_F25I$dem3 z$on?(Wn;Yk=@vKdmwndeWuE*li?7yv)?hE*=r`|?eZu1AJ+hg5CCi)lzfQNfdEe^W z7B}xzjb 09S|DgI>{X3B5U%jE>wmVUrtmYm!n9B8EvDw_Bwb7M)rZvv^U#WLANF!_0V zUR}wyDONqUQ>DLBr?>0d=ri9kcaZc2_;9#Urw=m3w#Z5_-*T>JwpE1w_oz }od|B6?VBm^NVP531{qbMf8MtFzpliOc*qcfa-&L`Vkr?!Q`^) ^2YQ80XwztzWBR7b>gOf7QiDBjP7XmBtaldlp z#%Qb~H?weOw6`fY5?Q+~E!w*{H!O GHmXHRGPYq z7U(Wg8ySJ_Mc6>)ditxnp7w{w?Osw4jeRyH_D<~GaO{(4>_6eyhhFjOqPgMan**^9 zltJv!@=LcwQ1HC24gQFKMsDVWrre2vt4kr%ANm@FO;N8a^AJ(^LUPN|{zPT;?~Uld zp}ufzmy|1W?VdqWv=LXtHhucM+Ud!-{0}JIvaRogV;_9_eAhPr)@|6@`kw3^F=X#e zu{1HT{}@;?C*PDW;{S^@rp!p!C+UGl_K*5^MY?vSUzx2$zfpNEgH~Tp#tJD>W_c{* zK^6B_vOQgI1=jA#V3RVs{t<}W=-&*x;wGho`8RLf);sK=$Dy=u>-N~+`p*-Cj6Jbu zVES8op_pqwhxA@+_oS=xM(SQz`;WB9jXfi-kMw3-u@&_oh5TngWd4!1^`E`NekOK` z+Fha+WzO9DnV46QIWSiD*Ho^*7iSdT;`$YcPFZE0-=6M_Z;u{}=&r@NW&V!+mmJXb zRa)l=DXG`(`qxP0SN@J2#BK(Y@$D2nzHP?X_Wi;>Z*cQQxo0q_ZNcYn7{a#Vb7tm; zf#Ji=aCfQ Cfi=67=GfoCJn(7Q|L?W$Wg_dowcB$7YrgPripDnk zH?Dm@(;FMQp2{rj^Ns@RWt_x;NgtQY5o1Y-Iyjl*L;OhcZHKBdpQ{ y!w9&z|=Oi0;%|ER?V*qp`t@l$U#nEERAD+^!i z{gHoM|B~;in*Su)d+@_h>C-I$f=@~ eZritRY1ci4fEy4OM@pNjZD3&pmK zd@0iPK{~4AsVe{Hfkz5a?f;7O4m-4}Yj=8J%{vkq^}h!CbSUshQQ(oiBmOrdU7sRu z-8rED4y@^~=q(BM4$BWbG8PA72>RC+_O1OaGZfof`}=>pK2psm;CmeW3pZm@5ql{V zds(Id6XnodrjIAyp0RO9x`%eBO)kMw$w2`8y?;$(*zugCNA$=GOMx> zM?1`~qCJrBiRNa8V_(N!#gSK8g*+xkL9=l*4kO9I7zv{?6L}vSG9$nwNC{T;W*iUU za8=hvzjt5@k6WBOap~P%>-~}Rrrf*