Mercurial > hgrepos > Python2 > PyMuPDF
diff mupdf-source/thirdparty/leptonica/README.html @ 2:b50eed0cc0ef upstream
ADD: MuPDF v1.26.7: the MuPDF source as downloaded by a default build of PyMuPDF 1.26.4.
The directory name has changed: no version number in the expanded directory now.
| author | Franz Glasner <fzglas.hg@dom66.de> |
|---|---|
| date | Mon, 15 Sep 2025 11:43:07 +0200 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mupdf-source/thirdparty/leptonica/README.html Mon Sep 15 11:43:07 2025 +0200 @@ -0,0 +1,1261 @@ +<html> +<body BGCOLOR=FFFFE4> + +<!-- JS Window Closer ----- +<form> +<center> +<input type="button" onclick="window.close();" value="Close this window"> +</center> +</form> +----- JS Window Closer --> + + +<!-- Creative Commons License --> +<a rel="license" href="http://creativecommons.org/licenses/by/2.5/"><img alt="Creative Commons License" border="0" src="http://creativecommons.org/images/public/somerights20.gif" /></a> +This work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by/2.5/">Creative Commons Attribution 2.5 License</a>. +<!-- /Creative Commons License --> + + +<!-- + +<rdf:RDF xmlns="http://web.resource.org/cc/" + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> +<Work rdf:about=""> + <dc:title>leptonica</dc:title> + <dc:date>2001</dc:date> + <dc:description>An open source C library for efficient image processing and image analysis operations</dc:description> + <dc:creator><Agent> + <dc:title>Dan S. Bloomberg</dc:title> + </Agent></dc:creator> + <dc:rights><Agent> + <dc:title>Dan S. Bloomberg</dc:title> + </Agent></dc:rights> + <dc:type rdf:resource="http://purl.org/dc/dcmitype/Text" /> + <dc:source rdf:resource="www.leptonica.com"/> + <license rdf:resource="http://creativecommons.org/licenses/by/2.5/" /> +</Work> + +<License rdf:about="http://creativecommons.org/licenses/by/2.5/"> + <permits rdf:resource="http://web.resource.org/cc/Reproduction" /> + <permits rdf:resource="http://web.resource.org/cc/Distribution" /> + <requires rdf:resource="http://web.resource.org/cc/Notice" /> + <requires rdf:resource="http://web.resource.org/cc/Attribution" /> + <permits rdf:resource="http://web.resource.org/cc/DerivativeWorks" /> +</License> + +</rdf:RDF> + +--> + +<pre> +/*====================================================================* + - 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. + *====================================================================*/ + +README (version 1.85.0) +File update: Oct 16 2024 +--------------------------- + +gunzip leptonica-1.85.0.tar.gz +tar -xvf leptonica-1.85.0.tar + +</pre> + +<!--Navigation Panel--> +<hr> +<P> +<A HREF="#BUILDING">Building leptonica</A><br> +<A HREF="#DEPENDENCIES">I/O libraries leptonica is dependent on</A><br> +<A HREF="#DOXYGEN">Generating documentation using doxygen</A><br> +<A HREF="#DEVELOP">Developing with leptonica</A><br> +<A HREF="#CONTENTS">What's in leptonica?</A><br> +<P> +<hr> +<!--End of Navigation Panel--> + + +<h2> <A NAME="BUILDING"> +Building leptonica +</h2> + +<pre> +1. Top view + + This tar includes: + (1) src: library source and function prototypes for building liblept + (2) prog: source for regression test, usage example programs, and + sample images + for building on these platforms: + - Linux on x86 (i386) and AMD 64 (x64) + - OSX (both powerPC and x86). + - Cygwin, msys and mingw on x86 + There is an additional zip file for building with MS Visual Studio. + + Libraries, executables and prototypes are easily made, as described below. + + When you extract from the archive, all files are put in a + subdirectory 'leptonica-1.85.0'. In that directory you will + find a src directory containing the source files for the library, + and a prog directory containing source files for various + testing and example programs. + +2. Building on Linux/Unix/MacOS + + The software can be downloaded from either a release tar file or + from the current head of the source. For the latter, go to a directory + and clone the tree into it (note the '.' at the end): + cd [some directory] + git clone https://github.com/DanBloomberg/leptonica.git . + + There are three ways to build the library: + + (1) By customization: Use the existing static makefile, + src/makefile.static and customize the build by setting flags + in src/environ.h. See details below. + Note: if you are going to develop with leptonica, the static + makefiles are useful. + + (2) Using autoconf (supported by James Le Cuirot). + Run ./configure in this directory to + build Makefiles here and in src. Autoconf handles the + following automatically: + * architecture endianness + * enabling Leptonica I/O image read/write functions that + depend on external libraries (if the libraries exist) + * enabling functions for redirecting formatted image stream + I/O to memory (on Linux only) + After running ./configure: make; make install. There's also + a 'make check' for testing. + + (3) Using cmake (supported by Egor Pugin). + The build must always be in a different directory from the root + of the source (here). It is common to build in a subdirectory + of the root. From the root directory, do this: + mkdir build + cd build + Then to make only the library: + cmake .. + make + To make both the library and the programs: + cmake .. -DBUILD_PROG=1 + make + To clean out the current build, just remove everything in + the build subdirectory. + + In more detail for these three methods: + + (1) Customization using the static makefiles: + + * FIRST THING: Run make-for-local. This simply renames + src/makefile.static --> src/makefile + prog/makefile.static --> prog/makefile + [Note: the autoconf build will not work if you have any files + named "makefile" in src or prog. If you've already run + make-for-local and renamed the static makefiles, and you then + want to build with autoconf, run make-for-auto to rename them + back to makefile.static.] + + * You can customize for: + (a) Including Leptonica image I/O functions that depend on external + libraries, such as libpng. Use environment variables in + src/environ.h, such as HAVE_LIBPNG. + (b) Disabling the GNU functions for redirecting formatted stream I/O + to memory. By default, HAVE_FMEMOPEN is enabled in src/environ.h. + (c) Using special memory allocators (see src/environ.h). + (d) Changing compile and runtime defaults for messages to stderr. + The default in src/environ.h is to output info, warning and + error messages. + (e) Specifying the location of the object code. By default it + goes into a tree whose root is also the parent of the src + and prog directories. This can be changed using the + ROOT_DIR variable in makefile. + + * Build the library: + - To make an optimized version of the library (in src): + make + - To make a debug version of the library (in src): + make DEBUG=yes debug + - To make a shared library version (in src): + make SHARED=yes shared + - To make the prototype extraction program (in src): + make (to make the library first) + make xtractprotos + + * To use shared libraries, you need to include the location of + the shared libraries in your LD_LIBRARY_PATH. For example, + after you have built programs with 'make SHARED=yes' in the + prog directory, you need to tell the programs where the shared + libraries are: + export LD_LIBRARY_PATH=../lib/shared:$LD_LIBRARY_PATH + + * Make the programs in prog/ (after you have make liblept): + - Customize the makefile by setting ALL_LIBS to link the + external image I/O libraries. By default, ALL_LIBS assumes that + libtiff, libjpeg and libpng are available. + - To make an optimized version of all programs (in prog): + make + - To make a debug version of all programs (in prog): + make DEBUG=yes + - To make a shared library version of all programs (in prog): + make SHARED=yes + - To run the programs, be sure to set + export LD_LIBRARY_PATH=../lib/shared:$LD_LIBRARY_PATH + + (2) Building using autoconf (Thanks to James Le Cuirot) + + * If you downloaded from a release tar, it will be "configure ready". + * If you cloned from the git master tree, you need to make the + configure executable. To do this, run + autogen.sh. + + Use the standard incantation, in the root directory (the + directory with configure): + ./configure [build the Makefile] + make [builds the library and shared library versions of + all the progs] + make install [as root; this puts liblept.a into /usr/local/lib/ + and 13 of the progs into /usr/local/bin/ ] + make [-j2] check [runs the alltests_reg set of regression tests. + This works even if you build in a different + place from the distribution. The -j parameter + should not exceed half the number of cores. + NOTE: If the test fails, it's likely due to a race + condition. Rerun with 'make check'] + + Configure supports installing in a local directory (e.g., one that + doesn't require root access). For example, to install in $HOME/local, + ./configure --prefix=$HOME/local/ + make install + For different ways to build and link leptonica with tesseract, see + https://github.com/tesseract-ocr/tesseract/wiki/Compiling + In brief, using autotools to build tesseract and then install it + in $HOME/local (after installing leptonica there), do the + following from your tesseract root source directory: + ./autogen.sh + LIBLEPT_HEADERSDIR=$HOME/local/include ./configure \ + --prefix=$HOME/local/ --with-extra-libraries=$HOME/local/lib + make install + + Configure also supports building in a separate directory from the + source. Run "/(path-to)/leptonica-1.85.0/configure" and then "make" + from the desired build directory. + + Configure has a number of useful options; run "configure --help" for + details. If you're not planning to modify the library, adding the + "--disable-dependency-tracking" option will speed up the build. By + default, both static and shared versions of the library are built. Add + the "--disable-shared" or "--disable-static" option if one or the other + isn't needed. To skip building the programs, use "--disable-programs". + + By default, the library is built with debugging symbols. If you do not + want these, use "CFLAGS=-O2 ./configure" to eliminate symbols for + subsequent compilations, or "make CFLAGS=-O2" to override the default + for compilation only. Another option is to use the 'install-strip' + target (i.e., "make install-strip") to remove the debugging symbols + when the library is installed. + + Finally, if you find that the installed programs are unable to link + at runtime to the installed library, which is in /usr/local/lib, + try to run configure in this way: + LDFLAGS="-Wl,-rpath -Wl,/usr/local/lib" ./configure + which causes the compiler to pass those options through to the linker. + + For the Debian distribution, out of all the programs in the prog + directory, we only build a small subset of general purpose + utility programs. This subset is the same set of programs that + 'make install' puts into /usr/local/bin. It has no dependency on + the image files that are bundled in the prog directory for testing. + + (3) Using cmake + + The usual method is to build in a directory that is a subdirectory + of the root. First do this from the root directory: + mkdir build + cd build + + The default build (shared libraries, no debug, only the library) + is made with + cmake .. + For other options, you can use these flags on the cmake line: + * To make a static library: + cmake .. -DBUILD_SHARED_LIBS=OFF + make + * To make a dynamic library (default) and STATIC (or builtin) dependencies: + cmake .. -DSW_BUILD_SHARED_LIBS=0 + make + * To build with debug: + cmake .. -DCMAKE_BUILD_TYPE=Debug + make + * To make both the library and the programs: + cmake .. -DBUILD_PROG=1 + make + + The programs are put in build/bin/ + To run these (e.g., for testing), move them to the prog + directory and run them from there: + cd bin + mv * ../../prog/ + cd ../../prog + alltests_reg generate + alltests_reg compare + + To build the library directly from the root directory instead of + the build subdirectory: + mkdir build + cmake -H . -Bbuild (-H means the source directory, + -B means the directory for the build + make + +3. Building on Windows + + (a) Building with Visual Studio + + 1. Download the latest SW + (Software Network https://software-network.org/) + client from https://software-network.org/client/ + 2. Unpack it, add to PATH. + 3. Run once to perform cmake integration: + sw setup + 4. Run: + git clone https://github.com/danbloomberg/leptonica + cd leptonica + mkdir build + cd build + cmake .. + 5. Build a solution (leptonica.sin) in your Visual Studio version. + + (b) Building for mingw32 with <a href="http://www.mingw.org/">MSYS</a> + (Thanks to David Bryan) + + MSYS is a Unix-compatible build environment for the Windows-native + mingw32 compiler. Selecting the "mingw-developer-toolkit", + "mingw32-base", and "msys-base" packages during installation will allow + building the library with autoconf as in (2) above. It will also allow + building with the static makefile as in (1) above if this option is used + in the make command line: + + CC='gcc -std=c99 -U__STRICT_ANSI__' + + Only the static library may be built this way; the autoconf method must + be used if a shared (DLL) library is desired. + + External image libraries (see below) must be downloaded separately, + built, and installed before building the library. Pre-built libraries + are available from the <a + href="http://sourceforge.net/projects/ezwinports/">ezwinports</a> project. + + (c) Building for <a href="http://www.cygwin.com/">Cygwin</a> + (Thanks to David Bryan) + + Cygwin is a Unix-compatible build and runtime environment. Adding the + "binutils", "gcc-core", and "make" packages from the "Devel" category and + the "diffutils" package from the "Utils" category to the packages + installed by default will allow building the library with autoconf as in + (2) above. Pre-built external image libraries are available in the + "Graphics" and "Libs" categories and may be selected for installation. + If the libraries are not installed into the /lib, /usr/lib, or + /usr/local/lib directories, you must run make with the + "LDFLAGS=-L/(path-to-image)/lib" option. Building may also be performed + with the static makefile as in (1) above if this option is used in the + make command: + + CC='gcc -std=c99 -U__STRICT_ANSI__' + + Only the static library may be built this way; the autoconf method must + be used if a shared (DLL) library is desired. + +4. Building and running oss-fuzz programs + + The oss-fuzz programs are in prog/fuzzing/. They are run by oss-fuzz + on a continual basis with random inputs. clang-10, which is required + to build these programs, can be installed using the command + sudo apt-get install clang-10 + + Stefan Weil has provided this method for building the fuzzing programs. + From your github root: + ./autogen.sh (to make configure) + mkdir -p bin/fuzzer + cd bin/fuzzer + Run configure to generate the Makefiles: + address sanitizer issue: + ../../configure CC=clang-10 CXX=clang++-10 CFLAGS="-g -O2 \ + -D_GLIBCXX_DEBUG -fsanitize=fuzzer-no-link,address,undefined" \ + CXXFLAGS="-g -O2 -D_GLIBCXX_DEBUG \ + -fsanitize=fuzzer-no-link,address,undefined" + memory sanitizer issue: + ../../configure CC=clang-10 CXX=clang++-10 CFLAGS="-g -O2 \ + -D_GLIBCXX_DEBUG -fsanitize=fuzzer-no-link,memory,undefined" \ + CXXFLAGS="-g -O2 -D_GLIBCXX_DEBUG \ + -fsanitize=fuzzer-no-link,memory,undefined" + Build: + address sanitizer issue: + make fuzzers CXX=clang++-10 CXXFLAGS="-g -O2 -D_GLIBCXX_DEBUG \ + -fsanitize=fuzzer,address,undefined" + memory sanitizer issue: + make fuzzers CXX=clang++-10 CXXFLAGS="-g -O2 -D_GLIBCXX_DEBUG \ + -fsanitize=fuzzer,memory,undefined" + + When an oss-fuzz issue has been created, download the Reproducer + Testcase file (e.g, name it "/tmp/payload"). To run one of the + fuzzing executables in bin/fuzzer, e.g., pix4_fuzzer: + cd ../../prog/fuzzing + ../../bin/fuzzer/pix4_fuzzer /tmp/payload + +5. The 270+ programs in the prog directory are an integral part of this + package. They can be divided into four groups: + + (1) Programs that are useful applications for running on the + command line. They can be installed from autoconf builds + using 'make install'. Examples of these are the PostScript + and pdf conversion programs: converttopdf, converttops, + convertfilestopdf, convertfilestops, convertsegfilestopdf, + convertsegfilestops, imagetops, printimage and printsplitimage. + + (2) Programs that are used as regression tests in alltests_reg. + These are named *_reg, and 100 of them are invoked together + (alltests_reg). The regression test framework has been + standardized, and regresstion tests are relatively easy + to write. See regutils.h for details. + + (3) Other regression tests, some of which have not (yet) been + put into the framework. They are also named *_reg. + + (4) Programs that were used to test library functions or auto-generate + library code. These are useful for testing the behavior of small + sets of functions and for providing example code. + +6. Sanitizers can be used on all the regression tests in alltests_reg.c. + + First run autogen.sh to generate the configure script + autogen.sh + Then run configure to generate the Makefile with the address sanitizer + ./configure '--disable-shared' '--enable-debug' 'CFLAGS=-D_GLIBCXX_DEBUG -DDEBUG=1 -Wall -pedantic -g -O0 -fsanitize=address,undefined -fstack-protector-strong -ftrapv' + Make and run all the regression tests + make check +</pre> + +<h2> <A NAME="DEPENDENCIES"> +I/O libraries leptonica is dependent on +</h2> + +<pre> + Leptonica is configured to handle image I/O using these external + libraries: libjpeg, libtiff, libpng, libz, libwebp, libgif, libopenjp2 + + These libraries are easy to obtain. For example, using the + Debian package manager: + sudo apt-get install <package> + where <package> = {libpng-dev, libjpeg62-turbo-dev, libtiff5-dev, + libwebp-dev, libopenjp2-7-dev, libgif-dev}. + + Leptonica also allows image I/O with bmp and pnm formats, for which + we provide the serializers (encoders and decoders). It also + gives output drivers for wrapping images in PostScript and PDF, which + in turn use tiffg4, jpeg and flate (i.e., zlib) encoding. PDF will + also wrap jpeg2000 images. + + There is a programmatic interface to gnuplot. To use it, you + need only the gnuplot executable (suggest version 3.7.2 or later); + the gnuplot library is not required. + + If you build with automake, libraries on your system will be + automatically found and used. + + The rest of this section is for building with the static makefiles. + The entries in environ.h specify which of these libraries to use. + The default is to link to these four libraries: + libjpeg.a (standard jfif jpeg library, version 6b or 7, 8 or 9)) + libtiff.a (standard Leffler tiff library, version 3.7.4 or later; + libpng.a (standard png library, suggest version 1.4.0 or later) + libz.a (standard gzip library, suggest version 1.2.3) + current non-beta version is 3.8.2) + + These libraries (and their shared versions) should be in /usr/lib. + (If they're not, you can change the LDFLAGS variable in the makefile.) + Additionally, for compilation, the following header files are + assumed to be in /usr/include: + jpeg: jconfig.h + png: png.h, pngconf.h + tiff: tiff.h, tiffio.h + + If for some reason you do not want to link to specific libraries, + even if you have them, stub files are included for the ten + different output formats: + bmp, jpeg, png, pnm, ps, pdf, tiff, gif, webp and jp2. + For example, if you don't want to include the tiff library, + in environ.h set: + #define HAVE_LIBTIFF 0 + and the stubs will be linked in. + + To read and write webp files: + (1) Download libwebp from sourceforge + (2) #define HAVE_LIBWEBP 1 (in environ.h) + (3) In prog/makefile, edit ALL_LIBS to include -lwebp + (4) The library will be installed into /usr/local/lib. + You may need to add that directory to LDFLAGS; or, equivalently, + add that path to the LD_LIBRARY_PATH environment variable. + + To read and write jpeg2000 files: + (1) Download libopenjp2, version 2.3, from their distribution. + (2) #define HAVE_LIBJP2K 1 (in environ.h) + (2a) If you have version 2.X, X != 3, edit LIBJP2K_HEADER (in environ.h) + (3) In prog/makefile, edit ALL_LIBS to include -lopenjp2 + (4) The library will be installed into /usr/local/lib. + + To read and write gif files: + (1) Download version giflib-5.1.X+ from souceforge + (2) #define HAVE_LIBGIF 1 (in environ.h) + (3) In prog/makefile, edit ALL_LIBS to include -lgif + (4) The library will be installed into /usr/local/lib. +</pre> + + +<h2> <A NAME="DOXYGEN"> +Generating documentation using doxygen +</h2> + +<pre> +The source code is set up to allow generation of documentation using doxygen. +To do this: +(1) Download the Debian doxygen package: + sudo apt-get install doxygen +(2) In the root client directory containing Doxyfile: + doxygen Doxyfile +The documentation will be generated in a 'doc' subdirectory, accessible +from this file (relative to the root) + ./doc/html/index.html +</pre> + + +<h2> <A NAME="DEVELOP"> +Developing with leptonica +</h2> + +<pre> +You are encouraged to use the static makefiles if you are developing +applications using leptonica. The following instructions assume +that you are using the static makefiles and customizing environ.h. + +1. Automatic generation of prototypes + + The prototypes are automatically generated by the program xtractprotos. + They can either be put in-line into allheaders.h, or they can be + written to a file leptprotos.h, which is #included in allheaders.h. + Note: (1) We supply the former version of allheaders.h. + (2) all .c files simply include allheaders.h. + + First, make xtractprotos: + make xtractprotos + + Then to generate the prototypes and make allheaders.h, do one of + these two things: + make allheaders [puts everything into allheaders.h] + make allprotos [generates a file leptprotos.h containing the + function prototypes, and includes it in allheaders.h] + + Things to note about xtractprotos, assuming that you are developing + in Leptonica and need to regenerate the prototypes in allheaders.h: + + (1) xtractprotos is part of Leptonica. You can 'make' it in either + src or prog (see the makefile). + (2) You can output the prototypes for any C file to stdout by running: + xtractprotos <cfile> or + xtractprotos -prestring=[string] <cfile> + (3) The source for xtractprotos has been packaged up into a tar + containing just the Leptonica files necessary for building it + in Linux. The tar file is available at: + www.leptonica.com/source/xtractlib-1.5.tar.gz + +2. Global parameter to enable development and testing + + For security reasons, with the exception of the regression utility + (regutils.c), leptonica as shipped (starting with 1.77) does not allow: + * 'system(3)' fork/exec + * writes to temp files with compiled-in names + System calls are used either to run gnuplot or display an image on + the screen. + + This is enforced with a global parameter, LeptDebugOK, initialized to 0. + It can be overridden either at compile time by changing the initialization + (in writefile.c), or at runtime, using setLeptDebugOK(). + The programs in the prog directory, which mostly test functions in + the library, are not subject to this restriction. + +3. GNU runtime functions for stream redirection to memory + + There are two non-standard gnu functions, fmemopen() and open_memstream(), + that only work on Linux and conveniently allow memory I/O with a file + stream interface. This is convenient for compressing and decompressing + image data to memory rather than to file. Stubs are provided + for all these I/O functions. Default is to enable them; OSX developers + must disable by setting #define HAVE_FMEMOPEN 0 (in environ.h). + If these functions are not enabled, raster to compressed data in + memory is accomplished safely but through a temporary file. + See 9 for more details on image I/O formats. + + If you're building with the autoconf programs, these two functions are + automatically enabled if available. + +4. Runtime functions not available on all platforms + + Some functions are not available on all systems. One example of such a + function is fstatat(). If possible, such functions will be replaced by + wrappers, stubs or behavioral equivalent functions. By default, such + functions are disabled; enable them by setting #define HAVE_FUNC 1 (in + environ.h). + + If you're building with the autoconf or cmake programs, these functions are + automatically enabled if available. + +5. Typedefs + + A deficiency of C is that no standard has been universally + adopted for typedefs of the built-in types. As a result, + typedef conflicts are common, and cause no end of havoc when + you try to link different libraries. If you're lucky, you + can find an order in which the libraries can be linked + to avoid these conflicts, but the state of affairs is aggravating. + + The most common typedefs use lower case variables: uint8, int8, ... + The png library avoids typedef conflicts by altruistically + appending "png_" to the type names. Following that approach, + Leptonica appends "l_" to the type name. This should avoid + just about all conflicts. In the highly unlikely event that it doesn't, + here's a simple way to change the type declarations throughout + the Leptonica code: + (1) customize a file "converttypes.sed" with the following lines: + /l_uint8/s//YOUR_UINT8_NAME/g + /l_int8/s//YOUR_INT8_NAME/g + /l_uint16/s//YOUR_UINT16_NAME/g + /l_int16/s//YOUR_INT16_NAME/g + /l_uint32/s//YOUR_UINT32_NAME/g + /l_int32/s//YOUR_INT32_NAME/g + /l_float32/s//YOUR_FLOAT32_NAME/g + /l_float64/s//YOUR_FLOAT64_NAME/g + (2) in the src and prog directories: + - if you have a version of sed that does in-place conversion: + sed -i -f converttypes.sed * + - else, do something like (in csh) + foreach file (*) + sed -f converttypes.sed $file > tempdir/$file + end + + If you are using Leptonica with a large code base that typedefs the + built-in types differently from Leptonica, just edit the typedefs + in environ.h. This should have no side-effects with other libraries, + and no issues should arise with the location in which liblept is + included. + + For compatibility with 64 bit hardware and compilers, where + necessary we use the typedefs in stdint.h to specify the pointer + size (either 4 or 8 byte). + +6. Compile and runtime control over stderr output (see environ.h and utils1.c) + + Leptonica provides both compile-time and run-time control over + messages and debug output (thanks to Dave Bryan). Both compile-time + and run-time severity thresholds can be set. The runtime threshold + can also be set by an environmental variable. Messages are + vararg-formatted and of 3 types: error, warning, informational. + These are all macros, and can be further suppressed when + NO_CONSOLE_IO is defined on the compile line. For production code + where no output is to go to stderr, compile with -DNO_CONSOLE_IO. + + Runtime redirection of stderr output is also possible, using a + callback mechanism. The callback function is registered using + leptSetStderrHandler(). See utils1.c for details. + +7. In-memory raster format (Pix) + + Unlike many other open source packages, Leptonica uses packed + data for images with all bit/pixel (bpp) depths, allowing us + to process pixels in parallel. For example, rasterops works + on all depths with 32-bit parallel operations throughout. + Leptonica is also explicitly configured to work on both little-endian + and big-endian hardware. RGB image pixels are always stored + in 32-bit words, and a few special functions are provided for + scaling and rotation of RGB images that have been optimized by + making explicit assumptions about the location of the R, G and B + components in the 32-bit pixel. In such cases, the restriction + is documented in the function header. The in-memory data structure + used throughout Leptonica to hold the packed data is a Pix, + which is defined and documented in pix.h. The alpha component + in RGB images is significantly better supported, starting in 1.70. + + Additionally, a FPix is provided for handling 2D arrays of floats, + and a DPix is provided for 2D arrays of doubles. Converters + between these and the Pix are given. + +8. Conversion between Pix and other in-memory raster formats + + . If you use Leptonica with other imaging libraries, you will need + functions to convert between the Pix and other image data + structures. To make a Pix from other image data structures, you + will need to understand pixel packing, pixel padding, component + ordering and byte ordering on raster lines. See the file pix.h + for the specification of image data in the pix. + +9. Custom memory management + + Leptonica allows you to use custom memory management (allocator, + deallocator). For Pix, which tend to be large, the alloc/dealloc + functions can be set programmatically. For all other structs and arrays, + the allocators are specified in environ.h. Default functions + are malloc and free. We have also provided a sample custom + allocator/deallocator for Pix, in pixalloc.c. +</pre> + + +<h2> <A NAME="CONTENTS"> +What's in leptonica? +</h2> +<pre> +1. Rasterops + + This is a source for a clean, fast implementation of rasterops. + You can find details starting at the Leptonica home page, + and also by looking directly at the source code. + Some of the low-level code is in roplow.c, and an interface is + given in rop.c to the simple Pix image data structure. + +2. Binary morphology + + This is a source for efficient implementations of binary morphology + Details are found starting at the Leptonica home page, and by reading + the source code. + + Binary morphology is implemented two ways: + + (a) Successive full image rasterops for arbitrary + structuring elements (Sels) + + (b) Destination word accumulation (dwa) for specific Sels. + This code is automatically generated. See, for example, + the code in fmorphgen.1.c and fmorphgenlow.1.c. + These files were generated by running the program + prog/fmorphautogen.c. Results can be checked by comparing dwa + and full image rasterops; e.g., prog/fmorphauto_reg.c. + + Method (b) is considerably faster than (a), which is the + reason we've gone to the effort of supporting the use + of this method for all Sels. We also support two different + boundary conditions for erosion. + + Similarly, dwa code for the general hit-miss transform can + be auto-generated from an array of hit-miss Sels. + When prog/fhmtautogen.c is compiled and run, it generates + the dwa C code in fhmtgen.1.c and fhmtgenlow.1.c. These + files can then be compiled into the libraries or into other programs. + Results can be checked by comparing dwa and rasterop results; + e.g., prog/fhmtauto_reg.c + + Several functions with simple parsers are provided to execute a + sequence of morphological operations (plus binary rank reduction + and replicative expansion). See morphseq.c. + + The structuring element is represented by a simple Sel data structure + defined in morph.h. We provide (at least) seven ways to generate + Sels in sel1.c, and several simple methods to generate hit-miss + Sels for pattern finding in selgen.c. + + In use, the most common morphological Sels are separable bricks, + of dimension n x m (where either n or m, but not both, is commonly 1). + Accordingly, we provide separable morphological operations on brick + Sels, using for binary both rasterops and dwa. Parsers are provided + for a sequence of separable binary (rasterop and dwa) and grayscale + brick morphological operations, in morphseq.c. The main + advantage in using the parsers is that you don't have to create + and destroy Sels, or do any of the intermediate image bookkeeping. + + We also give composable separable brick functions for binary images, + for both rasterop and dwa. These decompose each of the linear + operations into a sequence of two operations at different scales, + reducing the operation count to a sum of decomposition factors, + rather than the (un-decomposed) product of factors. + As always, parsers are provided for a sequence of such operations. + +3. Grayscale morphology and rank order filters + + We give an efficient implementation of grayscale morphology for brick + Sels. See the Leptonica home page and the source code. + + Brick Sels are separable into linear horizontal and vertical elements. + We use the van Herk/Gil-Werman algorithm, that performs the calculations + in a time that is independent of the size of the Sels. Implementations + of tophat and hdome are also given. + + We also provide grayscale rank order filters for brick filters. + The rank order filter is a generalization of grayscale morphology, + that selects the rank-valued pixel (rather than the min or max). + A color rank order filter applies the grayscale rank operation + independently to each of the (r,g,b) components. + +4. Image scaling + + Leptonica provides many simple and relatively efficient + implementations of image scaling. Some of them are listed here; + for the full set see the web page and the source code. + + Grayscale and color images are scaled using: + - sampling + - lowpass filtering followed by sampling, + - area mapping + - linear interpolation + + Scaling operations with antialiased sampling, area mapping, + and linear interpolation are limited to 2, 4 and 8 bpp gray, + 24 bpp full RGB color, and 2, 4 and 8 bpp colormapped + (bpp == bits/pixel). Scaling operations with simple sampling + can be done at 1, 2, 4, 8, 16 and 32 bpp. Linear interpolation + is slower but gives better results, especially for upsampling. + For moderate downsampling, best results are obtained with area + mapping scaling. With very high downsampling, either area mapping + or antialias sampling (lowpass filter followed by sampling) give + good results. Fast area map with power-of-2 reduction are also + provided. Optional sharpening after resampling is provided to + improve appearance by reducing the visual effect of averaging + across sharp boundaries. + + For fast analysis of grayscale and color images, it is useful to + have integer subsampling combined with pixel depth reduction. + RGB color images can thus be converted to low-resolution + grayscale and binary images. + + For binary scaling, the dest pixel can be selected from the + closest corresponding source pixel. For the special case of + power-of-2 binary reduction, low-pass rank-order filtering can be + done in advance. Isotropic integer expansion is done by pixel replication. + + We also provide 2x, 3x, 4x, 6x, 8x, and 16x scale-to-gray reduction + on binary images, to produce high quality reduced grayscale images. + These are integrated into a scale-to-gray function with arbitrary + reduction. + + Conversely, we have special 2x and 4x scale-to-binary expansion + on grayscale images, using linear interpolation on grayscale + raster line buffers followed by either thresholding or dithering. + + There are also image depth converters that don't have scaling, + such as unpacking operations from 1 bpp to grayscale, and + thresholding and dithering operations from grayscale to 1, 2 and 4 bpp. + +5. Image shear and rotation (and affine, projective, ...) + + Image shear is implemented with both rasterops and linear interpolation. + The rasterop implementation is faster and has no constraints on image + depth. We provide horizontal and vertical shearing about an + arbitrary point (really, a line), both in-place and from source to dest. + The interpolated shear is used on 8 bpp and 32 bpp images, and + gives a smoother result. Shear is used for the fastest implementations + of rotation. + + There are three different types of general image rotators: + + a. Grayscale rotation using area mapping + - pixRotateAM() for 8 bit gray and 24 bit color, about center + - pixRotateAMCorner() for 8 bit gray, about image UL corner + - pixRotateAMColorFast() for faster 24 bit color, about center + + b. Rotation of an image of arbitrary bit depth, using + either 2 or 3 shears. These rotations can be done + about an arbitrary point, and they can be either + from source to dest or in-place; e.g. + - pixRotateShear() + - pixRotateShearIP() + + c. Rotation by sampling. This can be used on images of arbitrary + depth, and done about an arbitrary point. Colormaps are retained. + + The area mapping rotations are slower and more accurate, because each + new pixel is composed using an average of four neighboring pixels + in the original image; this is sometimes also also called "antialiasing". + Very fast color area mapping rotation is provided. + + The shear rotations are much faster, and work on images of arbitrary + pixel depth, but they just move pixels around without doing any averaging. + The pixRotateShearIP() operates on the image in-place. + + We also provide orthogonal rotators (90, 180, 270 degree; left-right + flip and top-bottom flip) for arbitrary image depth. + And we provide implementations of affine, projective and bilinear + transforms, with both sampling (for speed) and interpolation + (for antialiasing). + +6. Sequential algorithms + + We provide a number of fast sequential algorithms, including + binary and grayscale seedfill, and the distance function for + a binary image. The most efficient binary seedfill is + pixSeedfill(), which uses Luc Vincent's algorithm to iterate + raster- and antiraster-ordered propagation, and can be used + for either 4- or 8-connected fills. Similar raster/antiraster + sequential algorithms are used to generate a distance map from + a binary image, and for grayscale seedfill. We also use Heckbert's + stack-based filling algorithm for identifying 4- and 8-connected + components in a binary image. A fast implementation of the + watershed transform, using a priority queue, is included. + +7. Image enhancement + + Some simple image enhancement routines for grayscale and color + images have been provided. These include intensity mapping with + gamma correction and contrast enhancement, histogram equalization, + edge sharpening, smoothing, and various color-shifting operations. + +8. Convolution and cousins + + A number of standard image processing operations are also + included, such as block convolution, binary block rank filtering, + grayscale and rgb rank order filtering, and edge and local + minimum/maximum extraction. Generic convolution is included, + for both separable and non-separable kernels, using float arrays + in the Pix. Two implementations are included for grayscale and + color bilateral filtering: a straightforward (slow) one, and a + fast, approximate, separable one. + +9. Image I/O + + Some facilities have been provided for image input and output. + This is of course required to build executables that handle images, + and many examples of such programs, most of which are for + testing, can be built in the prog directory. Functions have been + provided to allow reading and writing of files in JPEG, PNG, + TIFF, BMP, PNM ,GIF, WEBP and JP2 formats. These formats were chosen + for the following reasons: + + - JFIF JPEG is the standard method for lossy compression + of grayscale and color images. It is supported natively + in all browsers, and uses a good open source compression + library. Decompression is supported by the rasterizers + in PS and PDF, for level 2 and above. It has a progressive + mode that compresses about 10% better than standard, but + is considerably slower to decompress. See jpegio.c. + + - PNG is the standard method for lossless compression + of binary, grayscale and color images. It is supported + natively in all browsers, and uses a good open source + compression library (zlib). It is superior in almost every + respect to GIF (which, until recently, contained proprietary + LZW compression). See pngio.c. + + - TIFF is a common interchange format, which supports different + depths, colormaps, etc., and also has a relatively good and + widely used binary compression format (CCITT Group 4). + Decompression of G4 is supported by rasterizers in PS and PDF, + level 2 and above. G4 compresses better than PNG for most + text and line art images, but it does quite poorly for halftones. + It has good and stable support by Leffler's open source library, + which is clean and small. Tiff also supports multipage + images through a directory structure. Note: because jpeg is + a supported tiff compression mode, leptonica requires linking + both libtiff and libjpeg to read and write tiff. See tiffio.c + + - BMP has (until recently) had no compression. It is a simple + format with colormaps that requires no external libraries. + It is commonly used because it is a Microsoft standard, + but has little besides simplicity to recommend it. See bmpio.c. + + - PNM is a very simple, old format that still has surprisingly + wide use in the image processing community. It does not + support compression or colormaps, but it does support binary, + grayscale and rgb images. Like BMP, the implementation + is simple and requires no external libraries. See pnmio.c. + + - WEBP is a new wavelet encoding method derived from libvpx, + a video compression library. It is rapidly growing in acceptance, + and is supported natively in several browsers. Leptonica provides + an interface through webp into the underlying codec. You need + to download libwebp. See webpio.c. + + - JP2 (jpeg2000) is a wavelet encoding method, that has clear + advantages over jpeg in compression and quality (especially when + the image has sharp edges, such as scanned documents), but is + only slowly growing in acceptance. For it to be widely supported, + it will require support on a major browser (as with webp). + Leptonica provides an interface through openjpeg into the underlying + codec. You need to download libopenjp2, version 2.X. See jp2kio.c. + + - GIF is still widely used in the world. With the expiration + of the LZW patent, it is practical to add support for GIF files. + The open source gif library is relatively incomplete and + unsupported (because of the Sperry-Rand-Burroughs-Univac + patent history). Leptonica supports versions 5.1+. See gifio.c. + + Here's a summary of compression support and limitations: + - All formats except JPEG, WEBP and JP2K support 1 bpp binary. + - All formats support 8 bpp grayscale (GIF must have a colormap). + - All formats except GIF support rgb color. + - All formats except PNM, JPEG, WEBP and JP2K support 8 bpp colormap. + - PNG and PNM support 2 and 4 bpp images. + - PNG supports 2 and 4 bpp colormap, and 16 bpp without colormap. + - PNG, JPEG, TIFF, WEBP, JP2K and GIF support image compression; + PNM and BMP do not. + - WEBP supports rgb color and rgba. + - JP2 supports 8 bpp grayscale, rgb color and rgba. + Use prog/ioformats_reg for a regression test on all formats, including + thorough testing on TIFF. + For more thorough testing on other formats, use: + - prog/pngio_reg for PNG. + - prog/gifio_reg for GIF + - prog/webpio_reg for WEBP + - prog/jp2kio_reg for JP2 + + We provide generators for PS output, from all types of input images. + The output can be either uncompressed or compressed with level 2 + (ccittg4 or dct) or level 3 (flate) encoding. You have flexibility + for scaling and placing of images, and for printing at different + resolutions. You can also compose mixed raster (text, image) PS. + See psio1.c for examples of how to output PS for different applications. + As examples of usage, see: + * prog/converttops.c for a general image --> PS conversion + for printing. You can specify the PS compression level (1, 2, or 3). + * prog/imagetops.c for a special image --> PS conversion + for printing at maximum size on 8.5 x 11 paper. You can + specify the PS compression level (1, 2, or 3). + * prog/convertfilestops.c to generate a multipage level 3 compressed + PS file that can then be converted to pdf with ps2pdf. + * prog/convertsegfilestops.c to generate a multipage, mixed raster, + level 2 compressed PS file. + + We provide generators for PDF output, again from all types of input + images, and with ccittg4, dct, flate and jpx (jpeg2000) compression. + You can do the following for PDF: + * Put any number of images onto a page, with specified input + resolution, location and compression. + * Write a mixed raster PDF, given an input image and a segmentation + mask. Non-image regions are written in G4 (fax) encoding. + * Concatenate single-page PDF wrapped images into a single PDF file. + * Build a PDF file of all images in a directory or array of file names. + As examples of usage, see: + * prog/converttopdf.c: fast pdf generation with one image/page. + For speed, this avoids transcoding whenever possible. + * prog/convertfilestopdf.c: more flexibility in the output. You + can set the resolution, scaling, encoding type and jpeg quality. + * prog/convertsegfilestopdf.c: generates a multipage, mixed raster pdf, + with separate controls for compressing text and non-text regions. + + Note: any or all of these I/O library calls can be stubbed out at + compile time, using the environment variables in environ.h. + + For all formatted reads and writes, we support read from memory + and write to memory. The gnu C runtime library (glibc) supports + two I/O functions, open_memstream() and fmemopen(), which read + and write directly to memory as if writing to a file stream. + * On all platforms, leptonica supports direct read/write with memory + for TIFF, PNG, BMP, GIF and WEBP formats. + * On linux, leptonica uses the special gnu libraries to enable + direct read/write with memory for JPEG, PNM and JP2. + * On platforms without the gnu libraries, such as OSX, Windows + and Solaris, read/write with memory for JPEG, PNM and JP2 goes + through temp files. + To enable/disable memory I/O for image read/write, see environ.h. + + We also provide fast serialization and deserialization between a pix + in memory and a file (spixio.c). This works on all types of pix images. + +10. Colormap removal and color quantization + + Leptonica provides functions that remove colormaps, for conversion + to either 8 bpp gray or 24 bpp RGB. It also provides the inverse + function to colormap removal; namely, color quantization + from 24 bpp full color to 8 bpp colormap with some number + of colormap colors. Several versions are provided, some that + use a fast octree vector quantizer and others that use + a variation of the median cut quantizer. For high-level interfaces, + see for example: pixConvertRGBToColormap(), pixOctreeColorQuant(), + pixOctreeQuantByPopulation(), pixFixedOctcubeQuant256(), + and pixMedianCutQuant(). + +11. Programmatic image display + + For debugging, pixDisplay() and pixDisplayWithTitle() in writefile.c + can be called to display an image using one of several display + programs (xzgv, xli, xv, l_view). If necessary to fit on the screen, + the image is reduced in size, with 1 bpp images being converted + to grayscale for readability. Another common debug method is to + accumulate intermediate images in a pixa, and then either view these + as a mosaic (using functions in pixafunc2.c), or gather them into + a compressed PDF or PostScript file for viewing with evince. Common + image display programs are: xzgv, xli, xv, display, gthumb, gqview, + evince, gv and acroread. + +12. Document image analysis + + Many functions have been included specifically to help with + document image analysis. These include skew and text orientation + detection; page segmentation; baseline finding for text; + unsupervised classification of connected components, characters + and words; dewarping camera images; adaptive binarization; and + a simple book-adaptive classifier for various character sets, + segmentation for newspaper articles, etc. + +13. Data structures + + Several simple data structures are provided for safe and efficient handling + of arrays of numbers, strings, pointers, and bytes. The generic + pointer array is implemented in four ways: as a stack, a queue, + a heap (used to implement a priority queue), and an array with + insertion and deletion, from which the stack operations form a subset. + Byte arrays are implemented both as a wrapper around the actual + array and as a queue. The string arrays are particularly useful + for both parsing and composing text. Generic lists with + doubly-linked cons cells are also provided. Other data structures + are provided for handling ordered sets and maps, as well as hash sets + and hash maps. + +14. Examples of programs that are easily built using the library: + + - for plotting x-y data, we give a programmatic interface + to the gnuplot program, with output to X11, png, ps or eps. + We also allow serialization of the plot data, in a form + such that the data can be read, the commands generated, + and (finally) the plot constructed by running gnuplot. + + - a simple jbig2-type classifier, using various distance + metrics between image components (correlation, rank + hausdorff); see prog/jbcorrelation.c, prog/jbrankhaus.c. + + - a simple color segmenter, giving a smoothed image + with a small number of the most significant colors. + + - a program for converting all images in a directory + to a PostScript file, and a program for printing an image + in any (supported) format to a PostScript printer. + + - various programs for generating pdf files from compressed + images, including very fast ones that don't scale and + avoid transcoding if possible. + + - converters between binary images and SVG format. + + - an adaptive recognition utility for training and identifying + text characters in a multipage document such as a book. + + - a bitmap font facility that allows painting text onto + images. We currently support one font in several sizes. + The font images and postscript programs for generating + them are stored in prog/fonts/, and also as compiled strings + in bmfdata.h. + + - a binary maze game lets you generate mazes and find shortest + paths between two arbitrary points, if such a path exists. + You can also compute the "shortest" (i.e., least cost) path + between points on a grayscale image. + + - a 1D barcode reader. This is still in an early stage of development, + with little testing, and it only decodes 6 formats. + + - a utility that will dewarp images of text that were captured + with a camera at close range. + + - a sudoku solver and generator, including a good test for uniqueness + + - see (13, above) for other document image applications. + +15. JBig2 encoder + + Leptonica supports an open source jbig2 encoder (yes, there is one!), + which can be downloaded from: + http://www.imperialviolet.org/jbig2.html. + To build the encoder, use the most recent version. This bundles + Leptonica 1.63. Once you've built the encoder, use it to compress + a set of input image files: (e.g.) + ./jbig2 -v -s <imagefile1 ...> > <jbig2_file> + You can also generate a pdf wrapping for the output jbig2. To do that, + call jbig2 with the -p arg, which generates a symbol file (output.sym) + plus a set of location files for each input image (output.0000, ...): + ./jbig2 -v -s -p <imagefile1 ...> + and then generate the pdf: + python pdf.py output > <pdf_file> + See the usage documentation for the jbig2 compressor at: + http://www.imperialviolet.org/binary/jbig2enc.html + You can uncompress the jbig2 files using jbig2dec, which can be + downloaded and built from: + http://jbig2dec.sourceforge.net/ + +16. Versions + + New versions of the Leptonica library are released several times + a year, and version numbers are provided for each release in the + following files: + src/makefile.static + CMakeLists.txt + configure.ac + allheaders_top.txt (and propagated to allheaders.h) + All even versions from 1.42 to 1.60 were originally archived at + http://code.google.com/p/leptonica, as well as all versions after 1.60. + These have now been transferred by Egor Pugin to github: + github.com/danbloomberg/leptonica + where all releases (1.42 - 1.85.0) are available; e.g., + https://github.com/DanBloomberg/leptonica/releases/tag/1.85.0 + The more recent releases, from 1.80, are also available at + leptonica.org/download.html + Note that if you are downloading from github, the releases are more + likely to be stable than the master. Also, if you download from + the master and use autotools (e.g., Makefile.am), you must first run + autogen.sh to generate the configure program and the Makefiles. + + The number of downloads of leptonica increased by nearly an order + of magnitude with 1.69, due to bundling with tesseract and + incorporation in ubuntu 12-04. Jeff Breidenbach has built all + the Debian releases, which require release version numbers. + The Debian binary release versions to date are: + 1.69 : 3.0.0 + 1.70 : 4.0.0 + 1.71 : 4.2.0 + 1.72 : 4.3.0 + 1.73 : 5.0.0 + 1.74 : 5.1.0 + 1.75 : 5.2.0 + 1.76 : 5.3.0 + 1.77 : 5.3.0 + 1.78 : 5.3.0 + 1.79 : 5.4.0 + 1.80 : 5.4.0 + 1.81 : 5.4.0 + 1.82 : 5.4.0 + 1.83 : 6.0.0 + 1.84 : 6.0.0 + 1.85 : 6.0.0 (in progress) + + A brief version chronology is maintained in version-notes.html. + Starting with gcc 4.3.3, error warnings (-Werror) are given for + minor infractions like not checking return values of built-in C + functions. I have attempted to eliminate these warnings. + In any event, you will see warnings with the -Wall flag. + +</pre> + +<!-- JS Window Closer ----- +<form> +<center> +<input type="button" onclick="window.close();" value="Close this window"> +</center> +</form> +----- JS Window Closer --> + +</body> +</html>
